Почему эта сборка не происходит в 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
требует по крайней мере одного из них для большинства операций. Или, по крайней мере, операции, которые включают в себя фактическое помещение вещей в вектор. Поскольку конструктор по умолчанию ничего не помещает в вектор, проблем с ним нет.
Неприличное поведение встроенных массивов — вот почему 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) и дополнительные
требования Назначаемых типов.
Массивы в стиле C не являются ни CopyConstructible, ни Assignable, поэтому их нельзя хранить в контейнерах. Предположительно это означает, что вы вошли в область неопределенного поведения, поэтому компилятор может делать все, что ему нравится в обоих случаях.