示例代码:
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())
在这里是什么意思?标准中的哪些规则决定了这三种情况之间的意义差异?
答案 0 :(得分:3)
规则说如果构造对于声明或语句的语法模糊不清,那么它被认为是声明。
[stmt.ambig] 1语法中涉及表达式语句和声明的含糊不清:表达式 - 具有函数式显式类型转换(5.2.3)的语句,因为它最左边的子表达式可以是indis- 从第一个声明者以a开头的声明中可以看出来。(在这种情况下,声明是a 声明。
X(X());
含糊不清,因为它可以是强制转换或函数声明,因此它被认为是声明。
int(int());
不能是函数声明,因为作为关键字的int
不是函数的有效名称。所以,没有歧义,它是演员。
同样,I(I());
不能是函数声明,因为虽然不是关键字,I
也不是有效名称,因为它会将类型I
重新声明为函数,这是不允许,所以这是演员。