【问题标题】:why vector's move ctor does not deduce a noexcept()?为什么vector的move ctor不推导出noexcept()?
【发布时间】:2013-04-22 07:36:32
【问题描述】:

为什么使用自定义分配器移动std::vector 的构造函数不会从分配器的行为中推断出noexcept()?

这导致封装此类向量的类无法形成某些<algorithm>s中可以正常移动的(其他)向量。即使底层类型满足必要的要求(MoveInsertable 和 DefaultInsertable)。

【问题讨论】:

  • 因为可能会有人从移动构造函数中抛出
  • 你能提供一些代码吗?我不明白你的意思。 noexcept 关于“分配器的行为”是什么?
  • 说,“分配器的行为”是指 noexcept(allocator::construct(...)) 和 noexcept(allocator::destroy(...)) 上的一些布尔表达式。
  • @BЈовић 但是在没有替代分配器的情况下移动向量的构造函数有noexcept。
  • 和移动赋值运算符有vector&operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())形式

标签: c++ c++11 g++ move-semantics


【解决方案1】:

我假设“使用自定义分配器移动 std::vector 的构造函数”是指分配器扩展的移动构造函数,即这个构造函数:

vector(vector&& v, const allocator_type& a);

主要原因是如果v.get_allocator() != a 那么构造函数必须分配更多的内存,这可能会抛出bad_alloc。在编译时无法知道给定类型的两个分配器是否总是比较相等(我已将此作为缺陷报告,请参阅LWG 2108)。

注意标准不要求此构造函数或vector(vector&&)移动构造函数为noexcept。

【讨论】:

  • 在这种情况下,“标准不要求”可以重述为“标准不允许”,对吗?
  • @mcmcc,不,这是不正确的。允许实现添加或加强异常规范,因此它符合为具有已知总是比较相等的分配器类型的特化添加noexcept(true)(例如std::allocator)
猜你喜欢
  • 2019-11-09
  • 2019-04-24
  • 2022-11-02
  • 2021-08-09
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多