8

此代码无法在 VS2010 中编译。它发出错误 C2440: 'argument' : cannot convert from 'A' to '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);
}
4

1 回答 1

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 的返回值是一个右值,因此应该在 C++11 之前的情况下调用 const A& 复制构造函数(不存在),或者在 C++11 的情况下调用移动构造函数。

于 2013-06-24T20:49:42.367 回答