1

VC11 Update 2 ではunique_ptr、std::vector で をプッシュするときに移動コンストラクターが必要なようです。これは文書化された動作ですか、それとも既知のバグですか?

#include < iostream>
#include <memory>
#include <vector>
struct TEST
{
    std::unique_ptr<int> m_l;
    TEST(
        std::unique_ptr<int>&& l)
    {
        m_l = std::move(l);
    };
    //Move Contructor for Test
    TEST(TEST&& o)
    {
        m_l = std::move(o.m_l);
    }
};
void Bar()
{
    std::vector<TEST> vec;
    std::unique_ptr<int> a(new int);
    //Compiles fine without a Move Constructor
    TEST(std::move(a));
    //Requires a Move Contructor to compile
    vec.push_back(
        TEST(std::move(a)));
}
int main()
{       
    Bar();
    return 0;
} 

ノート

上記のコードをIDEONE C++11で Move Constructor を使用せずに試してみたところ、正常にコンパイルされました。

4

1 に答える 1

3

move コンストラクターを自分で作成する必要はありません。この場合、コンパイラによって自動的に生成されます。ただし、VC11 はこの機能を実装しておらず、IIRC は VS2013 まで追加されません。

std::unique_ptrデータメンバーが存在するとコピーコンストラクターが削除されるため、VC11 が不平を言っていることに注意してください。§12.8p11 では、クラスのコピー コンストラクターを削除するこのプロセスについて説明しています。

暗黙的に宣言されたコピー/移動コンストラクターは、そのクラスのインライン パブリック メンバーです。クラス X のデフォルトのコピー/移動コンストラクターは、X が次の場合に削除済み (8.4.3) として定義されます

[...]

オーバーロードの解決 (13.3) が M の対応するコンストラクターに適用されるため、コピー/移動できないクラス型 M (またはその配列)非静的データ メンバー。デフォルトのコンストラクタ、

[...]

于 2013-10-07T08:44:35.837 に答える