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()
.