Visual Studio 2010 C++で次のコードに問題があります。オブジェクトジェネレータ呼び出しのr値参照にコピーコンストラクタが必要なのはなぜですか?
makeA()はC++でちょうどオブジェクト生成イディオムである
#include <stdio.h>
struct A{ // 7th line
A() {}
A(A &&) {printf("move\n");}
~A() {printf("~A();\n");}
private:
A(const A &) {printf("copy\n");} // 12th line
};
A makeA()
{
return A();
}
int main()
{
A &&rrefA(makeA()); // 22nd line
return 0;
}
エラーメッセージ
2>d:\test.cpp(22): error C2248: 'A::A' : cannot access private member declared in class 'A'
2> d:\test.cpp(12) : see declaration of 'A::A'
2> d:\test.cpp(7) : see declaration of 'A'
2>
(STD :: make_pairのように)私はmakeA()は両方ともA()コンストラクタを呼び出すことを期待します(A & &)のコンストラクタ、makeA()を呼び出すための22行目、それ以外のものはありません。 (RVOなしの場合) コンパイラはA(const A &)コンストラクタにアクセスする必要はありませんか?
コードに何が問題なのか教えていただけますか?
g ++の最新バージョンでは、 'g ++ -std = C++ 0x'と 'g ++ -std = C++ 0x -fno-elide-constructors'はエラーなしでコードをコンパイルします。
'A()'を{{} 'に変更してみてください。これは次のようなものです:http://stackoverflow.com/questions/7935639/can-we-return-objects-having-a-deleted-private -copy-move-constructor-by-value-fr – Pubby
@Pubby良いリンクですが、どういうわけか違う問題だと思います。 'A makeA(); 'のままにするコード内でのみmakeA()の本体を他のファイルに移動すると、前述の変更が不可視になります。 22行目がなければ、コードはコンパイルされます。 makeA()関数の問題ではないと思います。 – kcm1700
99%これはコンパイラのバグです。 [MS Connect](https://connect.microsoft.com/VisualStudio/)のバグレポートを投稿し、ここにリンクを投稿してください。 – ildjarn