答案 0 :(得分:15)
使用hyperlinked C++ grammar,decltype(void())
的解析是:
decltype( expression )
decltype( assignment-expression )
decltype( conditional-expression )
......涉及操作顺序的许多步骤都在这里......
decltype( postfix-expression )
decltype( simple-type-specifier ( expression-listopt ) )
decltype( void() )
所以void()
在这里是一种expression
,特别是postfix-expression
。
具体而言,引用2011年ISO C ++标准第5.2.3节[expr.type.conf]第2段:
表达式
T()
,其中T
是简单类型说明符或 typename-specifier 对于非数组完整对象类型或(可能是cv限定的)void
类型,创建一个prvalue 指定的类型,它是值初始化的(8.5;没有初始化是 完成void()
案例。
所以void()
是void
类型的表达式,就像int()
是int
类型的表达式(值0
)一样。很明显,void表达式没有值,但是这里它是decltype
的操作数,所以它没有被评估。 decltype
仅指其操作数的类型,而不是其值。
decltype(void())
只是一种引用void
类型的详细方式。
答案 1 :(得分:5)
我引用@JoachimPileborg的comment似乎正确地解释了它:
我想我现在想出来了,decltype需要一个表达式,而不是一个类型。 void()实际上不是这里的类型,但是表达式,C样式转换(就像例如int(12.34))void(void)不是表达式因此它不起作用。编译器解析不同的东西取决于上下文,当它期望一个类型它作为一个类型解析时,它需要一个表达式解析它作为一个表达式。 sizeof()(带括号)首先需要一个类型,否则它被解析为带括号的表达式。
我不是在寻找学分或声誉 无论如何,我想这是一个有趣的答案,对于未来的读者来说,值得一个专门的问题。