14

次のコードがあるとします。

#include <vector>

struct Foo
{
    int tag = 0;
    std::function<void ()> code;
};

int main()
{
   std::vector<Foo> v;
}

そして今、一時的なものを明示的に作成せFooに、特定のものを使用してベクターに新しいアイテムを追加したいと考えています。つまり、次のコンストラクターを追加する必要があります。tagcode Foo

struct Foo
{
    inline Foo(int t, std::function<void ()> c): tag(t), code(c) {}

    int tag = 0;
    std::function<void ()> code;
};

そして今、私は使用できますemplace_back

v.emplace_back(0, [](){});

しかし、新しく作成した構造体を使用して、これを 100 回も行う必要があったとき、ブレース初期化子を使用できないのではないかと考えました。そのようです:

#include <vector>

struct Foo
{
   int tag = 0;
   std::function<void ()> code;
};

int main()
{
   std::vector<Foo> v;
   v.push_back(Foo{ 0, [](){} });
}

これによりコンパイル エラーが発生します ('initializer-list' から 'Foo' に変換できません)。

4

2 に答える 2

9

C++11 標準によれば、は集合体ではありません。brace-or-equal-initializerFooが存在すると、集合体になることができなくなります。

ただし、このルールは C++14で変更されたため、コードを-std=c++14(またはコンパイラの同等の設定が何であれ)Fooコンパイルすると、集約になり、コードは正常にコンパイルされます。

ライブデモ

C++11 コンパイラの場合Foo、集約を作成する初期化子を削除するか、2 つの引数のコンストラクターを提供する必要があります。

于 2015-06-07T17:47:52.967 に答える