【问题标题】:C++ temporary class instantiation ambiguouslyC++ 临时类实例化模棱两可
【发布时间】:2015-03-15 08:38:49
【问题描述】:
让我们将程序形成为类。只有构造函数调用会产生一些副作用。调用后无需处理内存中的类实例。以下代码实例化该类:
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 声明而不是临时 A 对象实例化?
【问题讨论】:
标签:
c++
temporary-objects
【解决方案1】:
来自 C++11 标准,ISO/EIC 14882 §6.8 [stmt.ambig] ¶1(强调我的):
在涉及 表达式语句 和声明的语法中存在歧义:一个以函数样式显式类型转换 (5.2.3) 作为其的 表达式语句最左边的子表达式可能无法区分
来自第一个声明符以( 开头的声明。 在这些情况下,声明就是声明。
要将此应用于您的问题,A(x); 可以解析为“调用函数A/构造一个A 类型的临时对象,并将x 作为唯一的函数/构造函数参数传递”或“声明 A 类型的变量 x。”标准规定,在这种情况下,应该将其解析为变量声明。
您的其他示例并没有歧义,因为它们不能被解析为变量声明,因此它们被解析为对A 的构造函数的调用。
【解决方案2】:
那是因为您认为应该是 ctor 的参数列表,(x) 被解释为“括号中的x”。因此,A(x) 被读取为A (x) 被读取为A x。
在其他情况下,编译器会提示它应该生成一个A 实例,并使用提供的参数调用 ctor。