1

重複の可能性:
初期化子リストで外括弧を省略できるのはいつですか?

私はstd::arrayVisual Studio 2010で使用していますが、これは実際にstd::tr1::arrayは厄介な問題に直面しています。arrayたとえば、を引数として取る関数があります。

void do_something(std::tr1::array<int, 5> data)

関数のような呼び出しは機能do_something({1,2,3});せず、コンパイラ エラーが発生しますが、

std::tr1::array<int, 5> data = {1,2,3};
do_something(data);

します。前者が機能しない理由がよくわかりません。私が得るエラーは、 の)前にa がないことを教えてくれ{ます。これにより、初期化リストを期待していないと思われますが、そうでない理由はわかりません。初期化リストを誤用していませんか?

編集:std::tr1::array必要ありません、正常にstd::array動作します..

4

2 に答える 2

3

これを試して

do_something({{1,2,3}});

std::array初期化には2セットのブレースを使用しますが、特定の場合(投稿した例など)では、外側のスプリアスブレースを削除できます。これは役立つかもしれません:C ++ 11:正しいstd :: arrayの初期化?

于 2013-01-07T06:35:01.283 に答える
3

std::array標準ライブラリの他のコンテナとは異なり、 は集約と POD であるため、余分な中括弧が必要です。std::arrayユーザー定義のコンストラクターがありません。最初のデータ メンバーはサイズの配列N(テンプレート引数として渡す) であり、このメンバーは初期化子で直接初期化されます。直接初期化される内部配列には追加の中かっこが必要です。

これを次のように考えてください。

struct A
{
     int data[2];
};

のインスタンスを作成するとき、中かっこはいくつ必要Aですか?

A a{1,2};      //wrong as per the Standard (the compiler might allow it)
A b{ {1,2 } }; //correct

ではb、 の外側のペアがstruct{}に使用され、 の内側のペアがmember-arrayに使用されます。{}

それが役立つことを願っています。

于 2013-01-07T06:38:05.690 に答える