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';
}
这种明显差异的原因是什么?
答案 0 :(得分:6)
该标准允许实现根据
加强方法的异常规范17.6.5.12异常处理的限制[res.on.exception.handling]
4 C ++标准库中定义的析构函数操作不应抛出异常。 C ++标准库中的每个析构函数都应该表现得好像具有非抛出异常规范。除非另有说明,否则C ++标准库中定义的没有异常 - 规范的任何其他函数都可能抛出实现定义的异常。 191 实现可能会强化此隐式例外规范通过添加一个明确的。 192