这是这个问题的后续行动.
评价和在回答据说超过一次,更多的void{}是没有一个有效的类型-ID,也不是一个有效的表达式.
这很好,它是有道理的,这就是全部.
然后我通过工作草案的[7.1.7.4.1/2](占位符类型扣除).
有人说:
[...]
- 对于使用return包含占位符类型的返回类型声明的函数中发生的非丢弃 语句,T是声明的返回类型,并且e是return语句的操作数 .如果return语句没有操作数,那么e是void{};
[...]
那么,void{}(概念上)合法与否?
如果它在工作草案中提到是可接受的(尽管只是作为- 如果它是一个 -陈述),它必须是合法的.这意味着它也decltype(void{})应该是有效的,作为一个例子.
否则,工作草案应该使用void()而不是void{}?
嗯,说实话,我很确定我没有足够的技巧来指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?上面的子弹中提到了
什么void{},以及为什么在这种情况下它是一个法律表达?
这是问题的一个后续:什么是void()中decltype(void())意味着什么?.
decltype(void())编译好,void()在这种情况下的手段在上述问题中解释(实际上在答案中).
另一方面,我注意到decltype(void{})没有编译.
它们之间有什么区别(decltype至少在上下文中)?
为什么第二个表达式不能编译?
为了完整起见,它遵循一个最小的(不是)工作示例:
int main() {
// this doesn't compile
//decltype(void{}) *ptr = nullptr;
// this compiles fine
decltype(void()) *ptr = nullptr;
(void)ptr;
}
Run Code Online (Sandbox Code Playgroud)