[英]C++ temporary class instantiation ambiguously
让我们把程序形成为类。 只有构造函数调用会产生一些副作用。 调用后无需在内存中处理类实例。 以下代码实例化该类:
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;
}
(另请参阅在线IDE )
为什么A(x); 解释为变量x声明而不是临时对象实例?
从C ++ 11标准,ISO / EIC14882§6.8[stmt.ambig]¶1(强调我的):
在涉及表达式语句和声明的语法中存在歧义:具有函数式显式类型转换(5.2.3)的表达式语句 ,因为其最左侧的子表达式与第一个声明符以
(
a)开头的声明无法区分。 在这些情况下,该声明是一个声明。
将此问题应用于您的问题, A(x);
可以解析为“调用函数A
/构造类型A
的临时对象,并将x
作为唯一的函数/构造函数参数传递”或“声明类型A
的变量x
”。 标准说在这种情况下,它应该被解析为变量声明。
您的其他示例不明确,因为它们不能被解析为变量声明,因此它们被解析为对A
的构造函数的调用。
那是因为您认为应该是ctor的参数列表, (x)
被解释为“括号中的x
”。 因此, A(x)
被读取为A (x)
被读取为A x
。
在其他情况下,编译器有一个提示,表明它应该生成一个A
实例,并使用提供的参数调用ctor。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.