这段代码不应该按照标准中的12.8p2编译吗?

时间:2013-06-23 14:59:05

标签: c++ copy-constructor

此代码无法在VS2010中编译。它发出错误C2440:'参数':无法从'A'转换为'A&',但根据标准中的12.8p2,A::A(A&)是有效的复制构造函数,a是左值在A b = foo(a);中的main()表达式。

#include <iostream>

class A
{
    public:

    int x;
    A(int a) { x = a; std::cout << "Constructor\n"; }
    A(A& other) { x = other.x; std::cout << "Copy ctor\n"; }
    A(A&& other) { x = other.x; other.x = 0; std::cout << "Move ctor\n"; }
};

A foo(A a) 
{
    return a;
}

int main(void)
{
    A a(5);
    A b = foo(a);
}

1 个答案:

答案 0 :(得分:2)

我想说这取决于你所说的标准。假设C ++ 11然后我的看法是它应该没问题并且应该产生以下结果:

Constructor  <- Construction of 'a' in main
Copy ctor    <- Construction of 'a' in foo
Move ctor    <- Move from foo's return value into b

当你指出传入foo的a是一个左值。但是,来自foo的返回值是一个右值,因此应调用const A&amp;在前C ++ 11案例中复制构造函数(不存在),或者在C ++ 11案例中复制构造函数。