decltype(void())中的void()是表达式还是函数类型?

问题描述 投票:0回答:2

这是this问题的后续,更准确地说是this答案的评论。

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

c++ c++11 language-lawyer void decltype
2个回答
22
投票

使用超链接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
简单类型说明符typename-specifier 对于非数组完整对象类型或(可能是 cv 限定的)
void
类型,创建 指定的类型,它是值初始化的(8.5;没有初始化 已完成
void()
案例)。

因此

void()
void
类型的表达式,就像
int()
int
类型的表达式(具有值
0
)。显然 void 表达式没有值,但这里它是
decltype
的操作数,因此不对其求值。
decltype
仅指其操作数的类型,而不是其值。

decltype(void())
只是引用类型
void
的详细方式。


6
投票

我引用了 @JoachimPileborg 的 comment,它似乎正确地解释了它:

我想我现在明白了,decltype 需要一个表达式,而不是一个类型。 void() 实际上不是这里的类型,而是一个表达式,一个 C 风格的强制转换(就像 int(12.34) 一样) void(void) 不是一个表达式,因此它不起作用。编译器如何解析不同的东西取决于上下文,当它需要一个类型时,它会解析为一个类型,当它需要一个表达式时,它会解析为一个表达式。 sizeof() (带括号)首先需要一个类型,否则它会被解析为带括号的表达式。

我不是在寻找学分或声誉。
不管怎样,我想这是一个有趣的答案,值得未来的读者专门提出一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.