假设给定的类A
是使用公共(public)复制构造函数和私有(private)移动构造函数定义的。如果函数f
返回A
类型的对象,并且f
用于初始化A<类型变量的本地实例
,那么默认情况下(因为返回的值是右值)编译器将尝试使用移动构造函数。我相信,一旦编译器检测到移动构造函数是私有(private)的,期望编译器使用复制构造函数是明智的,但令我惊讶的是,我收到了一个编译器错误,指出移动构造函数是私有(private)的。我的问题如下,给出以下代码:
#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 中的变量?
最佳答案
我会改变这个类,因为它不合理。
或者从类派生或包装它。
如果你只是想快速破解,你可以这样做
template< class Type >
Type& tempref( Type&& t ) { return t; }
然后做
A a = tempref( f() )
免责声明:编译器未触及代码。
关于c++ - 当移动构造函数声明为私有(private)时使用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12981079/