ここ数日、C++11 をいじっていて、奇妙なことを思いつきました。
int を均一に初期化したい場合:
int a{5};
しかし、std::vector に対して同じことを行うと、次のようになります。
std::vector<int> b{2};
2 要素の配列を構築するのではなく、値 2 の 1 つの要素を持つ配列を構築します。それについてもっと明確にする必要があるという効果が得られるようです:
std::vector<int> c{{2}};
std::vector<int> d = {2};
しかし、b の宣言とは異なります。これは矛盾しているようです。私は同じ効果を持つ他のものを見てきました。私が尋ねているのは、この動作は最終的な C++11 標準での動作ですか、それとも初期に実装されたドラフトだけでしょうか? もしそうなら、なぜ標準化委員会はこの動作を含めたのですか? どのクラスがイニシャライザ リスト コンストラクタを持っているかを覚えておく必要があり、それらのクラスだけで {} の代わりに古い () 構文を使用する必要があるため、均一な初期化の目的全体が無効になっているようです。または、均一な初期化を完全に放棄します。
これは大きな「落とし穴」のようです。しかし、私が気づいていない利点があるかもしれません。
編集:このコード:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a{2};
for (auto x: a) {
std::cout << x << std::endl;
}
return 0;
}
gcc 4.6.2 で「2」を出力する