C++ 无效{}是否合法?
这是问题的后续行动。C++ 无效{}是否合法?,c++,language-lawyer,void,c++17,return-type-deduction,C++,Language Lawyer,Void,C++17,Return Type Deduction,这是问题的后续行动。 在注释和答案中,不止一次地提到,void{}既不是有效的类型id,也不是有效的表达式 这很好,很有道理,仅此而已 然后我完成了工作草案的(占位符类型推断)。 据说: […] -对于使用包含占位符类型的返回类型声明的函数中出现的未丢弃的return语句,T是声明的返回类型,e是return语句的操作数。如果return语句没有操作数,则e为void{} [……] 那么,void{}(概念上)合法吗? 如果它是工作草案中提到的可接受的(即使只是作为一个-好像它是一个-声明),它
在注释和答案中,不止一次地提到,
void{}
既不是有效的类型id,也不是有效的表达式
这很好,很有道理,仅此而已
然后我完成了工作草案的(占位符类型推断)。据说: […]
-对于使用包含占位符类型的返回类型声明的函数中出现的未丢弃的
return
语句,T
是声明的返回类型,e
是return
语句的操作数。如果return
语句没有操作数,则e
为void{}
[……] 那么,
void{}
(概念上)合法吗?如果它是工作草案中提到的可接受的(即使只是作为一个-好像它是一个-声明),它必须是合法的。例如,这意味着
decltype(void{})
也应该有效。否则,工作草案是否应该使用
void()
而不是void{}
嗯,老实说,我很确定我没有足够的技巧指出工作草案中的错误,所以真正的问题是:我的推理有什么错误?
上面的项目符号中提到的
void{}
到底是什么?为什么它在本案中是一个合法的表达方式?对我来说,这听起来像是有人把以前的标准与新标准合并起来搞砸了
以前的标准是这样说的:(C++14n4140,7.1.6.4.7[dcl.spec.auto]):
函数中出现[…]return
语句时
使用包含占位符类型、推断返回类型或变量类型的返回类型声明
由其初始值设定项的类型确定。如果返回值
没有操作数,则初始值设定项为
被认为是void()
较新的标准允许if constexpr
语句,因此需要更改语言以反映这一点if constexpr
导致了一个可能被丢弃的return
语句的概念(如果return
位于constexpr if的not take分支中,那么它被丢弃,并且返回类型从其他返回语句(如果有的话)中推断出来)
也许新的措辞应该是这样的:
对于函数中出现的非丢弃返回语句
使用包含占位符类型的返回类型声明,T
是
声明的返回类型和e
是return
语句的操作数。如果
return语句没有操作数,则T
为auto
,推导的返回类型为void
确认了错误。已修复。
是讨论(老实说,很短) 因此,答案是-不,
void{}
是不合法的。这是工作草案的一个措辞错误。我(微弱地)怀疑工作草案有错误。。。这就是为什么它是一个工作草案而不是一个标准@雅克:当然,提交一个问题仍然是个好主意。嗯,今天我学到了你可以
返回void()
@AndyGvoid()
可以在你无法想象的地方使用…:-)@skypjack:根据你的问题线索,看来你现在是专家了:-)1。类型应该是void()
,既不是void{}
也不是void
。2.你没有回答标题中的问题:void{}
合法吗?不,不是3.不确定constexpr是否因该错误而有罪。你为什么这么说?谢谢你的详细回答。@skypjack:不,类型不应该是void()
。目前的措辞是e
是void{}
,而YG只是谈论类型,从未尝试为e
编写表达式。N4296是C++17草稿。C++14文本是N4140。您引用的文本在C++14和N4296之间有所不同。@M.M很高兴知道。我的价格太低,无法获得真实文本,因此我使用了isocpp推荐的回退方法(N4296)。N4140是免费提供的,最好修改您的答案(或者使用N4140的报价;或者不声明报价来自C++14)