无效{}是否合法?

时间:2016-09-06 16:46:31

标签: c++ language-lawyer void c++17 return-type-deduction

这是对this问题的跟进。
在评论和答案中,不止一次地说void{} 既不是有效的类型ID也不是有效的表达式

这很好,这很有意义,就是这样。

然后我通过[7.1.7.4.1/2]占位符类型扣除)来完成工作草案。
有人说:

  

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

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

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

2 个答案:

答案 0 :(得分:11)

对我而言,听起来有人搞砸了将之前的标准与新标准合并。

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

  

在函数中发生[...] return语句时   声明的返回类型包含占位符类型,推导的返回类型或变量类型   根据其初始化程序的类型确定。如果return没有操作数,则初始化程序为   被认为是void()

较新的标准允许if constexpr语句,因此需要更改以反映该语言的语言。 if constexpr导致潜在的被丢弃的 return语句的概念(如果return位于constexpr的未采用分支中,则将其丢弃并且返回类型是从其他return语句中推断出来的,如果有的话。

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

  

表示函数中发生的非丢弃返回语句   使用包含占位符类型的返回类型声明,T是   声明的返回类型,ereturn语句的操作数。如果   return语句没有操作数,Tauto,推导的返回类型为void

答案 1 :(得分:10)

确认了这个错误。已经修好了。
Here是讨论(说实话很简短)。

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