I(I())的含义

时间:2017-08-04 00:15:31

标签: c++ language-lawyer most-vexing-parse

示例代码:

typedef int I;
struct X{ X(int); };

int main()
{
    int(int());
    X(X());
    I(I());
}

int(int());是一个使用功能强制转换符号的表达式 - 它是一个使用值初始化int初始化的临时int

X(X());是名为X的函数的声明,不返回struct X的参数。

我的问题是:I(I())在这里是什么意思?标准中的哪些规则决定了这三种情况之间的意义差异?

1 个答案:

答案 0 :(得分:3)

规则说如果构造对于声明或语句的语法模糊不清,那么它被认为是声明。

  

[stmt.ambig] 1语法中涉及表达式语句和声明的含糊不清:表达式 -   具有函数式显式类型转换(5.2.3)的语句,因为它最左边的子表达式可以是indis-   从第一个声明者以a开头的声明中可以看出来。(在这种情况下,声明是a   声明。

X(X());含糊不清,因为它可以是强制转换或函数声明,因此它被认为是声明。

int(int());不能是函数声明,因为作为关键字的int不是函数的有效名称。所以,没有歧义,它是演员。

同样,I(I());不能是函数声明,因为虽然不是关键字,I也不是有效名称,因为它会将类型I重新声明为函数,这是不允许,所以这是演员。