无效{}是否合法?

sky*_*ack 28 c++ void language-lawyer return-type-deduction c++17

这是这个问题的后续行动.
评价和在回答据说超过一次,更多的void{}没有一个有效的类型-ID,也不是一个有效的表达式.

这很好,它是有道理的,这就是全部.

然后我通过工作草案的[7.1.7.4.1/2](占位符类型扣除).
有人说:

[...]
- 对于使用return 包含占位符类型的返回类型声明的函数中发生的非丢弃  语句,  T 是声明的返回类型,并且  e 是return语句的操作数  .如果  return 语句没有操作数,那么  e 是  void{};
[...]

那么,void{}(概念上)合法与否?
如果它在工作草案中提到是可接受的(尽管只是作为- 如果它是一个 -陈述),它必须是合法的.这意味着它也decltype(void{})应该是有效的,作为一个例子.
否则,工作草案应该使用void()而不是void{}


嗯,说实话,我很确定我没有足够的技巧来指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?上面的子弹中提到了
什么void{},以及为什么在这种情况下它是一个法律表达?

And*_*dyG 11

对我而言,听起来有人搞砸了以前的标准和新标准.

以前标准说:(C++ 14 N4140,7.1.6.4.7 [dcl.spec.auto]):

return在使用包含占位符类型的返回类型声明的函数中发生[...] 语句时,推导的返回类型或变量类型由其初始值设定项的类型确定.在return没有操作数的情况下,初始化程序被认为是void().

较新的标准允许使用if constexpr语句,因此需要更改语言以反映该语句. if constexpr导致可能被丢弃的 return语句的概念(如果return它在constexpr的未采用分支中,那么它被丢弃并且返回类型是从其他返回语句推断的,如果有的话).

可能新的措辞应该是这样的:

对于在使用包含占位符类型的返回类型声明的函数中发生的非废弃返回语句,T是声明的返回类型,并且ereturn语句的操作数.如果return语句没有操作数,那么Tis auto和推导的返回类型是void


sky*_*ack 10

确认了这个bug.已经修好了.
是讨论(说实话很简短).

所以,答案是 - 不,void{}不合法.
这是工作草案的措辞错误.

  • 该答案现已过时,链接已失效。 (2认同)