使用超链接C++语法,对
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()
是 简单类型说明符 或 typename-specifier 对于非数组完整对象类型或(可能是 cv 限定的)
T
类型,创建 指定的类型,它是值初始化的(8.5;没有初始化 已完成
void
案例)。
void()
因此
void()
是 void
类型的表达式,就像 int()
是 int
类型的表达式(具有值 0
)。显然 void 表达式没有值,但这里它是 decltype
的操作数,因此不对其求值。 decltype
仅指其操作数的类型,而不是其值。
decltype(void())
只是引用类型 void
的详细方式。
我引用了 @JoachimPileborg 的 comment,它似乎正确地解释了它:
我想我现在明白了,decltype 需要一个表达式,而不是一个类型。 void() 实际上不是这里的类型,而是一个表达式,一个 C 风格的强制转换(就像 int(12.34) 一样) void(void) 不是一个表达式,因此它不起作用。编译器如何解析不同的东西取决于上下文,当它需要一个类型时,它会解析为一个类型,当它需要一个表达式时,它会解析为一个表达式。 sizeof() (带括号)首先需要一个类型,否则它会被解析为带括号的表达式。
我不是在寻找学分或声誉。
不管怎样,我想这是一个有趣的答案,值得未来的读者专门提出一个问题。