让我们将程序形成为类。只有构造函数调用会产生一些副作用。调用后无需在内存中处理类实例。以下代码实例化该类:
struct A{
A(int){}
};
int main() {
A(0);//right. Pass const to ctor
int x=0;
A(x);//bad. Compiler interpret like A x;
(A(x));//right. New temporary object passed to brackets
A((int)x);//right. Pass temporary int to ctor
return 0;
}
(另见Online IDE)
为什么A(x);解释为变量x声明而不是临时的对象实例?
答案 0 :(得分:4)
从C ++ 11标准,ISO / EIC14882§6.8[stmt.ambig]¶1(强调我的):
语法中涉及表达式语句和声明的含糊不清:带有函数式显式类型转换(5.2.3)的表达式语句最左边的子表达式是无法区分的 来自第一个声明符以
(
开头的声明。 在这些情况下,声明是声明。
要将此问题应用于您的问题,A(x);
可以解析为“调用函数A
/构造A
类型的临时对象,并传递x
作为只有函数/构造函数参数“或”声明类型为x
的变量A
。“标准说在这种情况下,它应该被解析为变量声明。
您的其他示例不明确,因为它们无法解析为变量声明,因此它们被解析为对A
的构造函数的调用。
答案 1 :(得分:1)
那是因为您认为应该是ctor的参数列表,(x)
被解释为括号中的“x
”。因此,A(x)
被读取为A (x)
被读为A x
。
在其他情况下,编译器有一个提示,表明它应该生成一个A
实例,并使用提供的参数调用ctor。