1

非ポッドメンバーを含む構造体をヒープに割り当て、初期化子リストを使用してそれらを初期化するいくつかのものを試していました。しかし、コンパイラは私のコードでエラーを検出しました。このスニペットはそれを再現します:

#include <vector>

struct A {
    int a;
};

struct B {
    int a;
    std::vector<int> b;
};

int main() {
    std::vector<int> some_vec;
    A a = {1}; // OK
    A b = A{1}; // OK
    A *c = new A{1}; // OK(leaks, NP)
    B d = {1, some_vec}; // OK
    B e = B{1, some_vec}; // OK

    B *f = new B{1, some_vec}; // Fails to compile

    B *g = new B({1, some_vec}); // OK
}

(リークがあることは知っています。それは承知しています。これは単なるテスト スニペットです)

指摘された行は、GCC 4.6.3 でコンパイルに失敗し、次のエラーが発生します。

test.cpp: In function ‘int main()’:
test.cpp:19:29: error: no matching function for call to ‘B::B(<brace-enclosed initializer list>)’
test.cpp:19:29: note: candidates are:
test.cpp:7:8: note: B::B()
test.cpp:7:8: note:   candidate expects 0 arguments, 2 provided
test.cpp:7:8: note: B::B(const B&)
test.cpp:7:8: note:   candidate expects 1 argument, 2 provided
test.cpp:7:8: note: B::B(B&&)
test.cpp:7:8: note:   candidate expects 1 argument, 2 provided

どうやら、コンパイラは、提供された初期化子リストを使用して構造体を初期化できません。奇妙なことに、エラーを生成する行の次の行は、同じイニシャライザ リストを使用して構築された別の行から a をコピーする (おそらく移動する) だけでB、エラーは発生しません。

私がやっていることは何か間違っていますか?つまり、提供されたスニペットの最後の行を使用して生きることができますが、演算子 new と初期化リストを使用して構造体を作成できない理由はありますか?

4

1 に答える 1

2

コードがコンパイルされ、動作するはずです。gcc 4.7.0 でテストしたところ、問題なく動作したため、バグは修正されたようです。標準の 8.5.4 List-initialization を読むと、 と書かれていますList intialization can be used as the initializer in a new expression (5.3.4)

于 2012-06-20T23:13:33.917 に答える