为什么向量被认为是nothrow_move_constructible?

Kno*_*abe 6 c++ c++11

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

vector(vector&&);
Run Code Online (Sandbox Code Playgroud)

注意缺乏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';
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*rey 6

该标准允许实现加强方法的异常规范

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

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

  • +1这种强化可以对`vector <vector <int >> :: push_back`产生显着(正)的性能影响.换句话说,缺少noexcept会对这种情况造成严重的性能损失. (2认同)