6

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

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';
}

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

4

1 回答 1

6

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

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

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

于 2013-11-14T20:47:24.133 回答