std::vector:: resize(тип размера) требует CopyInsertable?

этот вопрос я ответа это еще один вопрос.

N3337 23.3.6.3 "векторная емкость" говорит (это на странице 770):

void resize (size_type sz);

Эффекты: Если sz <= size(), что эквивалентно erase(begin() + sz, end());. Если size() < sz, добавляет sz - size() value-инициализированные элементы последовательности.

требуется: T должен быть CopyInsertable в *this.

, clang++ говорит, что все в порядке, хотя T не копируется. и я думаю, что это имеет смысл, что resize(size_type) требуется только destroyable/moveable/по умолчанию constructable. Он уничтожает if sz <= size, добавляет (который использует построение по умолчанию, а также разрушение и перемещение, если емкости недостаточно), если size() < sz.

что есть истина? Это стандартный дефект? Или это ошибка как clang++, так и меня?

1 ответов


вы правы. Это был дефект в C++11, который был исправлен для C++14 с помощьюhttp://cplusplus.github.io/LWG/lwg-defects.html#2033

нынешняя формулировка гласит:

Эффекты: Если sz < size(), стирает последние size() - sz элементов из последовательности. В противном случае, добавляет sz - size() default-вставленные элементы в последовательность.

требуется: T должно быть MoveInsertable и DefaultInsertable на *this.

в требование Destructible находится в таблице 95 и применяется ко всем операциям на всех контейнерах, а не только resize().