【问题标题】:Exception Requirements on Standard Containers标准容器的例外要求
【发布时间】:2015-08-28 23:27:02
【问题描述】:

C++11 §23.2.1.10 规定:

除非另有说明,否则定义的所有容器类型 在本条款中满足以下附加要求:

  • 如果 insert() 或 emplace() 函数在插入单个元素时引发异常,则该函数无效。
  • 没有 erase() 、 clear() 、 pop_back() 或 pop_front() 函数会引发异常。

关于第一个要点,容器如何保证这一点? T 的构造函数可能有副作用。应该不是“对容器没有影响

关于第二个要点,这通常调用allocator::deallocate(T*,size_t),而不是noexcept。为什么要掩盖最终的异常?

【问题讨论】:

  • 这些问题在std-discussion上不是更好吗?
  • deallocate() 要求不抛出异常。
  • 在分配器需求表([allocator.requirements])中查找deallocate
  • (也叫@LightnessRacesinOrbit):也许有人能想到一个更好的标题……
  • 标准中有很多地方在说“无影响”时并不完全意味着“在任何地方都没有影响”。例如,uninitialized_meow 函数。

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


【解决方案1】:

表 28 指定分配器的要求之一是 deallocate()“不抛出异常”。这就是标准如何断言erase()clear()pop_back()pop_front()

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多