这是对this问题的跟进。
在评论和答案中,不止一次地说void{}
既不是有效的类型ID也不是有效的表达式。
这很好,这很有意义,就是这样。
然后我通过[7.1.7.4.1/2](占位符类型扣除)来完成工作草案。
有人说:
[...]
- 对于使用包含占位符类型的返回类型声明的函数中发生的非丢弃return
语句,T
是声明的返回类型,e
是{的操作数{1}}陈述。如果return
语句没有操作数,则return
为e
;
[...]
那么,void{}
(概念上)是否合法?
如果它在工作草案中提到是可接受的(尽管只是作为 - 好像它是 - 语句),它必须是合法的。这意味着void{}
也应该是有效的,例如
否则,工作草案是否应使用decltype(void{})
而不是void()
?
嗯,说实话,我很确定我没有足够的技巧来指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?
上面的子弹中提到的void{}
究竟是什么?为什么它在这种情况下是一个法律表达?
答案 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
是 声明的返回类型,e
是return
语句的操作数。如果 return语句没有操作数,T
为auto
,推导的返回类型为void
答案 1 :(得分:10)
确认了这个错误。已经修好了。
Here是讨论(说实话很简短)。
所以,答案是 - 不,void{}
不合法
这是工作草案的措辞错误。