【问题标题】:std::vector::resize(size_type) requires CopyInsertable?std::vector::resize(size_type) 需要 CopyInsertable?
【发布时间】:2015-06-19 11:37:59
【问题描述】:

这个问题是在我回答this another question时提出的。

N333723.3.6.3 “向量容量”说(在 770 页):

void 调整大小(size_type sz);

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

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

但是,clang++ says it's okay though T is not copyable. 我认为resize(size_type) 只需要可破坏/可移动/默认可构造是有道理的。如果sz <= size 则销毁,如果size() < sz 则追加(使用默认构造,如果容量不足则销毁和移动)。

什么是真理?是标准缺陷吗?还是我和clang++都搞错了?

【问题讨论】:

    标签: c++ c++11 language-lawyer


    【解决方案1】:

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

    目前的措辞是:

    效果:如果是sz < size(),则从序列中删除最后一个size() - sz 元素。否则,追加 sz - size() 默认插入到序列中的元素。

    要求:T 应为 MoveInsertableDefaultInsertable*this

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

    【讨论】:

    • 在 C++14 标准中?
    • 那么,在c++11中,这只是标准的失败吗?
    • @PeterSchneider,是的,在 C++14 中,以及最新的工作草案。这是 C++11 中的一个缺陷。
    猜你喜欢
    • 2020-09-22
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2021-01-26
    • 2012-08-24
    相关资源
    最近更新 更多