特定のクラスA
がパブリック コピー コンストラクターとプライベート ムーブ コンストラクターで定義されているとします。関数が typeのf
オブジェクトを返し、 typeの変数のローカル インスタンスを初期化するために使用される場合、既定では (返される値が a であるため)、コンパイラは move コンストラクターを使用しようとします。移動コンストラクターがプライベートであることを検出したら、コンパイラーがコピー コンストラクターを使用することを期待するのが賢明だと思いましたが、驚いたことに、移動コンストラクターがプライベートであることを示すコンパイラ エラーを受け取りました。次のコードを考えると、私の質問は次のとおりです。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();
}
コピー コンストラクターを使用して main の変数を初期化できるように (A または f を変更せずに) コードを変更するにはどうすればよいですか?