次のコードを検討してください。
class Outer
{
class Inner
{
public:
Inner(Inner&& i):outers(std::move(i.outers)),test(std::move(test))
{}
void addOuter(const Outer& o) {outers.push_back(std::move(o));}
private:
std::vector<Outer> outers;
std::unique_ptr<std::string> test;
};
public:
Outer(Outer&& o):inners(std::move(o.inners))
{}
private:
std::vector<Inner> inners;
};
上記のコードを Visual Studio 2012 でコンパイルしようとすると、次のエラーが発生します。
Error 1 error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
どうやら、コンパイラは、メソッドにある push_back で move コンストラクターの代わりに copy コンストラクターを呼び出しますaddOuter
。これはコンパイラのバグですか? そうでない場合、この特定のケースでは、移動コンストラクターが呼び出されないのはなぜですか?