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.
我引用@JoachimPileborg 的评论似乎正确地解释了它:
我想我现在想出来了,decltype需要一个表达式,而不是一个类型.void()实际上不是这里的类型,但是表达式,C样式转换(就像例如int(12.34))void(void)不是表达式因此它不起作用.编译器解析不同的东西取决于上下文,当它期望一个类型它作为一个类型解析时,它需要一个表达式解析它作为一个表达式.sizeof()(带括号)首先需要一个类型,否则它被解析为带括号的表达式.
我不是在寻找学分或声誉.
无论如何,我想这是一个有趣的答案,答案值得为未来的读者提出一个专门的问题.
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |