14

重複の可能性:
C++11 emplace_back on vector<struct>?

POD で定置は可能ですか? Visual Studio 2012 では動作しないようです:

struct X
{
    int a;
    int b;
};

void whatever()
{
    std::vector<X> xs;
    X x = {1, 2};

    // okay
    xs.push_back(x);

    // okay
    xs.emplace_back(x);

    //error C2661: 'X::X': error C2661: no overloaded function takes 2 arguments
    xs.emplace_back(1, 2);
}

これは Visual Studio 2012 の単なる欠点ですか、それとも C++11 では単に POD を使用できないのでしょうか?

4

1 に答える 1

13

X::X(int,int)への呼び出しがオブジェクトemplace_backを構築するために使用するコンストラクターはありません。Xコンテナーはallocator_traits<A>::construct(allocator, p, args)、オブジェクトを構築するために使用します。ここで、pは割り当てられたスペースへのポインターでありargs、 はコンストラクターに渡される引数です。これは によって使用されemplace_backます。このconstruct関数は を呼び出す::new((void*)p) T(std::forward<Args>(args)...)ため、均一な初期化は使用しません。

xs.emplace_back({1, 2})リストの初期化で集約を構築できるという事実にもかかわらず、これもエラーになります。これは、中括弧で囲まれた初期化子リストを転送できないためです。

于 2012-12-19T22:13:28.173 に答える