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

问题描述 投票:0回答:2

假设给定的类

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 中的变量?

c++ constructor
2个回答
1
投票

我会改变课程,因为这不明智。

或者从类派生或包装它。

如果你只是想快速破解,你可以这样做

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

然后做

A a = tempref( f() )

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


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.