decltype(void())中的void()究竟是什么意思?

sky*_*ack 24 c++ void decltype language-lawyer c++11

这是对这个问题的跟进,更准确地说是这个答案的评论.

什么是void()decltype(void())代表什么呢?
它表示函数类型,表达式还是其他什么?

Yak*_*ont 15

使用超链接C++语法,解析decltype(void())是:

decltype( expression )
decltype( assignment-expression )
decltype( conditional-expression )
Run Code Online (Sandbox Code Playgroud)

......涉及运营秩序的许多步骤都在这里......

decltype( postfix-expression )
decltype( simple-type-specifier ( expression-listopt ) )
decltype( void() )
Run Code Online (Sandbox Code Playgroud)

所以这里void()有一种expression,特别是一种postfix-expression.

具体而言,引用2011年ISO C++标准的第5.2.3节[expr.type.conf]第2段:

表达式T(),其中是非数组完整对象类型T简单类型说明符类型名称说明,或者(可能是cv限定的)void类型,创建指定类型的prvalue,它是值初始化的(8.5;否初始化是针对void()案例完成的).

void()类型的表达式也是如此void,就像类型int()的表达式int(带有值0)一样.很明显,void表达式没有值,但是这里它是操作数decltype,所以它没有被计算.decltype仅指其操作数的类型,而不是其值.

decltype(void())只是一种冗长的引用类型的方式void.

  • 我冒昧地添加了对`void()`的含义的解释.请检查我的更新是否准确. (3认同)
  • @skypjack:参见C++ 11标准(或草案),第5.2.3节[expr.type.conv],第2节.A*simple-type-specifier*后跟空括号"创建指定的prvalue type,是初始化的(8.5;没有为void()情况进行初始化)".就像`int()`是`int`类型的表达式一样,`void()`是一个类型为`void`的表达式.因为它是`decltype`的操作数,所以它没有被评估.`decltype(void())`只是一种引用类型`void`的复杂方式.(Yakk,你可能想扩展你的答案来解释`void()`是一个表达式.) (2认同)

sky*_*ack 5

我引用@JoachimPileborg 的评论似乎正确地解释了它:

我想我现在想出来了,decltype需要一个表达式,而不是一个类型.void()实际上不是这里的类型,但是表达式,C样式转换(就像例如int(12.34))void(void)不是表达式因此它不起作用.编译器解析不同的东西取决于上下文,当它期望一个类型它作为一个类型解析时,它需要一个表达式解析它作为一个表达式.sizeof()(带括号)首先需要一个类型,否则它被解析为带括号的表达式.

我不是在寻找学分或声誉.
无论如何,我想这是一个有趣的答案,答案值得为未来的读者提出一个专门的问题.

  • `void()`不是C风格的演员表.在C中,强制转换由括号类型名称后跟表达式组成,例如`(void)42`.在`void()`中,类型名称没有括号,并且后面没有表达式. (2认同)