[英]What does the void() in decltype(void()) mean exactly?
使用超链接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()
,其中T
是非数组完整对象类型的简单类型说明符或类型名称说明 符 ,或者(可能是cv限定的)void
类型,创建指定类型的prvalue,它是值 -初始化(8.5;没有为void()
情况进行初始化)。
所以void()
是一个void
类型的表达式,就像int()
是一个int
类型的表达式(值为0
)。 很明显,void表达式没有值,但是这里它是decltype
的操作数,所以它没有被计算。 decltype
仅指其操作数的类型,而不是其值。
decltype(void())
只是一种引用void
类型的冗长方式。
我引用@JoachimPileborg的评论似乎正确地解释了它:
我想我现在想出来了,decltype需要一个表达式,而不是一个类型。 void()实际上不是这里的类型,但是表达式,C样式转换(就像例如int(12.34))void(void)不是表达式因此它不起作用。 编译器解析不同的东西取决于上下文,当它期望一个类型它作为一个类型解析时,它需要一个表达式解析它作为一个表达式。 sizeof()(带括号)首先需要一个类型,否则它被解析为带括号的表达式。
我不是在寻找学分或声誉。
无论如何,我想这是一个有趣的答案,对于未来的读者来说,值得一个专门的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.