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

时间:2016-09-01 19:03:21

标签: c++ c++11 language-lawyer void decltype

这是对this问题的跟进,更确切地说是this回答的评论。

void()中的decltype(void())到底代表什么? 它是代表函数类型,表达式还是其他什么?

2 个答案:

答案 0 :(得分:15)

使用hyperlinked C++ grammardecltype(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()(带括号)首先需要一个类型,否则它被解析为带括号的表达式。

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