为什么向量被认为是不可移动的可构造性?

时间:2013-11-14 20:34:53

标签: c++ c++11

vector的移动构造函数的规范是(复制出标准):

vector(vector&&);

请注意缺少noexcept。但gcc 4.8和Clang 3.2都报告std::is_nothrow_move_constructible<std::vector<int>>::value返回true(即1):

#include<vector>
#include<iostream>

int main()
{
  std::cout << std::is_nothrow_move_constructible<std::vector<int>>::value << '\n';
}

这种明显差异的原因是什么?

1 个答案:

答案 0 :(得分:6)

该标准允许实现根据

加强方法的异常规范
  

17.6.5.12异常处理的限制[res.on.exception.handling]

     

4 C ++标准库中定义的析构函数操作不应抛出异常。 C ++标准库中的每个析构函数都应该表现得好像具有非抛出异常规范。除非另有说明,否则C ++标准库中定义的没有异常 - 规范的任何其他函数都可能抛出实现定义的异常。 191 实现可能会强化此隐式例外规范通过添加一个明确的。 192