【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多