在声明移动构造函数但使用私有时使用复制构造函数

时间:2012-10-19 19:24:09

标签: c++ compiler-construction constructor

假设使用公共拷贝构造函数和私有移动构造函数定义了给定的类A。如果函数f返回类型为A的对象,并且f用于初始化类型为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中的变量?

2 个答案:

答案 0 :(得分:1)

首先执行重载决策,选择要调用的函数。

访问检查作为后续步骤执行,检查是否可以调用所选的函数/构造函数。

这是故意完成的,因此不调用私有函数(因为 私有)。在这种情况下让编译器选择另一个要调用的函数将不会有效。

答案 1 :(得分:1)

我会更改课程,因为它不合理。

或者从类派生或包装它。

如果你只想快速入侵,你可以做到

template< class Type >
Type& tempref( Type&& t ) { return t; }

然后做

A a = tempref( f() )

免责声明:编译器未触及的代码。