示例代码:
typedef int I;
struct X{ X(int); };
int main()
{
int(int());
X(X());
I(I());
}
行int(int());
是使用函数式强制表示法的表达式 - 它是使用值初始化int
初始化的临时int
。
行X(X());
是一个名为X
的函数的声明,该函数不带返回结构X
的参数。
我的问题是:这里I(I())
的含义是什么? 标准中的哪些规则决定了这三种情况之间的含义差异?
该规则规定,如果构造是声明或语句的模糊语法,则将其视为声明。
[stmt.ambig] 1 涉及表达式语句和声明的语法存在歧义:表达式- 以函数式显式类型转换 (5.2.3( 作为其最左侧子表达式的语句可以是不可分割的 可从第一个声明符以 (.在这些情况下,该语句是 声明。
X(X());
是不明确的,因为它可以是强制转换或函数声明,因此它被视为声明。
int(int());
不能是函数声明,因为int
作为关键字,不是函数的有效名称。所以,没有歧义,这是一个演员阵容。
同样,I(I());
不能是函数声明,因为虽然不是关键字,但I
也不是有效名称,因为它会将类型I
重新声明为函数,这是不允许的,因此它是强制转换。