void{} 是否合法?
Is void{} legal or not?
这是 问题的跟进。
在评论和答案中不止一次说 void{}
是 既不是有效的类型 ID 也不是有效的表达式 .
很好,有道理,仅此而已。
然后我通过了[7.1.7.4.1/2](占位符类型推导)的工作草案
据说:
[...]
- for a non-discarded return
statement that occurs in a function declared with a return type that contains a placeholder type, T
is the declared return type and e
is the operand of the return
statement. If the return
statement has no operand, then e
is void{}
;
[...]
那么,void{}
(概念上)合法吗?
如果它像工作草案中提到的那样是可以接受的(即使只是作为 - 就好像它是 - 声明一样),它必须确实是合法的。这意味着 decltype(void{})
也应该有效,例如。
否则,工作草案是否应该使用 void()
而不是 void{}
?
嗯,老实说,我很确定我不够熟练,无法指出工作草案中的错误,所以 真正的 问题是:什么 '我的推理有误吗?
上面项目符号中提到的 void{}
到底是什么,为什么它在这种情况下是合法的表达式?
对我来说,这听起来像是有人搞砸了将以前的标准与新标准合并。
之前标准是这样说的:(C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):
When a [...] return
statement occurs in a function
declared with a return type that contains a placeholder type, the deduced return type or variable type
is determined from the type of its initializer. In the case of a return
with no operand, the initializer is
considered to be void()
.
较新的标准允许 if constexpr
语句,因此需要更改语言以反映这一点。 if constexpr
导致潜在 discarded return
语句的概念(如果 return
在 constexpr if 的未采用分支中,则它被丢弃并且 return 类型是从其他 return 语句推断出来的,如果有的话)。
可能新的措辞应该是这样的:
for a non-discarded return statement that occurs in a function
declared with a return type that contains a placeholder type, T
is the
declared return type and e
is the operand of the return
statement. If
the return statement has no operand, then T
is auto
and the deduced return type is void
确认错误。已经修复。
Here 是讨论(说实话很短)。
所以,答案是 - 不,void{}
不合法。
这是工作草案的一个措辞错误。
这是
在评论和答案中不止一次说 void{}
是 既不是有效的类型 ID 也不是有效的表达式 .
很好,有道理,仅此而已。
然后我通过了[7.1.7.4.1/2](占位符类型推导)的工作草案
据说:
[...]
- for a non-discardedreturn
statement that occurs in a function declared with a return type that contains a placeholder type,T
is the declared return type ande
is the operand of thereturn
statement. If thereturn
statement has no operand, thene
isvoid{}
;
[...]
那么,void{}
(概念上)合法吗?
如果它像工作草案中提到的那样是可以接受的(即使只是作为 - 就好像它是 - 声明一样),它必须确实是合法的。这意味着 decltype(void{})
也应该有效,例如。
否则,工作草案是否应该使用 void()
而不是 void{}
?
嗯,老实说,我很确定我不够熟练,无法指出工作草案中的错误,所以 真正的 问题是:什么 '我的推理有误吗?
上面项目符号中提到的 void{}
到底是什么,为什么它在这种情况下是合法的表达式?
对我来说,这听起来像是有人搞砸了将以前的标准与新标准合并。
之前标准是这样说的:(C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):
When a [...]
return
statement occurs in a function declared with a return type that contains a placeholder type, the deduced return type or variable type is determined from the type of its initializer. In the case of areturn
with no operand, the initializer is considered to bevoid()
.
较新的标准允许 if constexpr
语句,因此需要更改语言以反映这一点。 if constexpr
导致潜在 discarded return
语句的概念(如果 return
在 constexpr if 的未采用分支中,则它被丢弃并且 return 类型是从其他 return 语句推断出来的,如果有的话)。
可能新的措辞应该是这样的:
for a non-discarded return statement that occurs in a function declared with a return type that contains a placeholder type,
T
is the declared return type ande
is the operand of thereturn
statement. If the return statement has no operand, thenT
isauto
and the deduced return type isvoid
确认错误。已经修复。
Here 是讨论(说实话很短)。
所以,答案是 - 不,void{}
不合法。
这是工作草案的一个措辞错误。