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{} 不合法
这是工作草案的一个措辞错误。