これが VS 2010 C++ でビルドされないのはなぜですか?
typedef float test[10];
std::vector<test> test_me(100); // wanted initial capacity of 100
これは問題なく構築されますが、
typedef float test[10];
std::vector<test> test_me_now;
これが VS 2010 C++ でビルドされないのはなぜですか?
typedef float test[10];
std::vector<test> test_me(100); // wanted initial capacity of 100
これは問題なく構築されますが、
typedef float test[10];
std::vector<test> test_me_now;
配列は、コピー構築可能でもムーブ構築可能でもありません。 std::vector
ほとんどの操作で少なくとも 1 つ必要です。または、少なくとも、実際にベクトルに物を入れる操作。デフォルトのコンストラクターはベクターに何も入れないので、問題なく使用できます。
組み込み配列のふさわしくない振る舞いstd::array
が発明された理由です。
これ
std::vector<test> test_me(100);
存在しないtest
,のデフォルト コンストラクタを呼び出そうとします。要素test()
を持つベクトルとは対照的に、容量を増やしたい場合は、試してください100
std::vector<test> test_me_now;
test_me_now.reserve(100);
ただし、ほとんどの操作は無効になるため、このようなベクトルを使用する方法を理解するのは困難です。
23.1/3 はこれについてかなり明確に見えます:
これらのコンポーネントに格納されるオブジェクトの型は、CopyConstructible 型 (20.1.3) の要件と、Assignable 型の追加要件を満たす必要があります。
C スタイルの配列は、CopyConstructible でも Assignable でもないため、コンテナーに格納できません。おそらくこれは、未定義の動作の領域に入ったため、コンパイラはどちらの場合でも好きなことを何でもできることを意味します。