std::vector::resize(size_type) requires CopyInsertable?

std::vector::resize(size_type) requires CopyInsertable?

本文关键字:requires type CopyInsertable size vector resize std      更新时间:2023-10-16

这个问题是在我回答另一个问题时提出的。

N3337 23.3.6.3"矢量容量"说(在770页):

空隙调整大小(size_type sz);

效果:若sz <= size(),相当于erase(begin() + sz, end());。如果size() < sz,则追加 sz - size()序列中的值初始化元素。

要求:T 应可复制插入到 *this 中。

但是,clang++ 说没关系,尽管 T 不可复制。我认为resize(size_type)只需要可破坏/可移动/默认可构造是有道理的。如果sz <= size则销毁,如果size() < sz,则附加(使用默认构造,如果容量不足则销毁和移动)。

什么是真理?是标准缺陷吗?还是叮叮当当和我的错误?

你是对的。这是 C++11 中的一个缺陷,由 http://cplusplus.github.io/LWG/lwg-defects.html#2033 修复了 C++14

目前的措辞是:

效果:如果sz < size() ,则从序列中擦除最后size() - sz元素。否则,附加 sz - size()序列中默认插入的元素。

要求:TMoveInsertableDefaultInsertable *this

Destructible的要求如表 95 所示,适用于所有容器上的所有操作,而不仅仅是 resize()