繁体   English   中英

C ++临时类实例化含糊不清

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM