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

时间:2015-03-15 08:38:50

标签: c++ temporary-objects

让我们将程序形成为类。只有构造函数调用会产生一些副作用。调用后无需在内存中处理类实例。以下代码实例化该类:

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声明而不是临时的对象实例?

2 个答案:

答案 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。