假设一个给定的类A
是用一个公共复制构造函数和一个私有移动构造函数定义的。如果一个函数f
返回一个类型为的对象A
,并f
用于初始化一个类型为变量的局部实例A
,那么默认情况下(因为返回的值为 a rvalue
),编译器将尝试使用移动构造函数。我相信一旦编译器检测到移动构造函数是私有的,期望编译器使用复制构造函数是明智的,但是令我惊讶的是,我收到了一个编译器错误,指出移动构造函数是私有的。鉴于以下代码,我的问题如下:
#include<iostream>
using namespace std;
class A
{
friend A f();
public:
A(const A&) { cout << "copy\n"; }
private:
A() {}
A(A&&) { cout << "move\n"; }
};
A f()
{
A a;
return a;
}
int main()
{
A a = f();
}
如何更改代码(不更改 A 或 f)以便可以使用复制构造函数初始化 main 中的变量?