11

これは機能します:

int arr[10] = {};

のすべての要素はarr、値がゼロに初期化されます。

これが機能しない理由:

std::array<int, 10> arr({}); 

g++ (バージョン 4.8.2) から次の警告が表示されます。

警告: メンバ 'std::array<int, 10ul>::_M_elems' の初期化子がありません</p>

4

3 に答える 3

5

まず、オブジェクトで初期化子を使用できますが、意味的には、一時的な値で初期化されたオブジェクトからのコピーコンストラクターを使用した直接初期化を表します。つまり、次と同等です({})std::arraystd::array

std::array<int, 10> arr(std::array<int, 10>{}); 

そして、実際にコンパイルすることになっています。

({})第二に、ただできるときは、本当に道を行く必要はありません

std::array<int, 10> arr = {};

また

std::array<int, 10> arr{};

2 つのうちの最初のものは、あなたの に構文的に最も似ていますint arr[10] = {};。構文のバージョンを作成したときに、({})代わりに使用することにしたのはなぜですか?= {}std::array= {}

于 2015-07-07T19:13:37.363 に答える
4

十分な数の人々が、これをコンパイルするときにこれを「問題」として指摘してい-Werrorます。

std::array<int, 10> arr{{}};

gcc 4.9.2 では警告が表示されません。

なぜこれが解決するのかについて少し追加します。私の理解では、 std::array は実際には C 配列を唯一のメンバーとして持つクラスです。したがって、中かっこを 2 倍にするのは理にかなっています。外側の中かっこはクラスを初期化していることを示し、次に内側の中かっこはデフォルトでクラスの唯一のメンバーを初期化します。

クラスに変数が 1 つしかない場合はあいまいさがないため、{} のペアを 1 つだけ使用することは合理的ですが、gcc はここで過度に衒学的であり、警告します。

于 2015-07-09T02:25:33.107 に答える