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
是声明的返回类型,并且e
是return
语句的操作数.如果return语句没有操作数,那么T
isauto
和推导的返回类型是void
归档时间: |
|
查看次数: |
673 次 |
最近记录: |