Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无效{}是否合法?_C++_Language Lawyer_Void_C++17_Return Type Deduction - Fatal编程技术网

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()
@AndyG
void()
可以在你无法想象的地方使用…:-)@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)