【问题标题】:Is std::vector exception neutral?std::vector 异常是中性的吗?
【发布时间】:2016-11-14 11:43:17
【问题描述】:

成员函数at() 的异常,我想不出异常是由std::vector 函数引发的,而是由其分配器或其元素构造函数和赋值运算符引发的。因此,在实现自己的分配器时,异常中立性可能是非常理想的保证。例如,您可以预先分配所有需要的内存,然后依靠分配器的 noexcept 保证传播到其容器。

C++ 标准是否提供std::vector<T,Alloc> 的异常中立性?

【问题讨论】:

  • “你可能会分配所有需要的内存”如果你不能这样做怎么办?
  • 准确定义“异常中立”一词对您的含义
  • @Arunmu 如果你做不到,那就早点扔。

标签: c++ c++11 exception vector


【解决方案1】:

除了内存分配之外,vector 本身也会抛出异常的一种情况:at() 成员函数。

所以,在reserve()ing 足够的内存之后,你可以保证不会抛出异常,前提是向量的类的构造函数和赋值运算符(将作为修改向量的一部分调用)也不会抛出任何异常,并且没有对at()的超出范围的调用。

【讨论】:

  • 没有涉及operator=的怪癖?
  • operator= 上的向量本身将属于“内存分配”类别。
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2012-06-30
相关资源
最近更新 更多