std::vector:: resize(тип размера) требует CopyInsertable?
этот вопрос я ответа это еще один вопрос.
N3337 23.3.6.3 "векторная емкость" говорит (это на странице 770):
, clang++ говорит, что все в порядке, хотя T не копируется. и я думаю, что это имеет смысл, чтоvoid resize (size_type sz);
Эффекты: Если
sz <= size(), что эквивалентноerase(begin() + sz, end());. Еслиsize() < sz, добавляетsz - size()value-инициализированные элементы последовательности.требуется: T должен быть CopyInsertable в *this.
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().