Lig*_*ica 22
没有.
[2003: 21.2.1/11 | n3290: 21.2.1/10]:除非另有规定(参见23.2.4.1,23.2.5.1,23.3.3.4和23.3.6.5)在本第定义的所有类型的容器满足以下附加要求:[..] - 无erase(),clear(),pop_back()或pop_front()函数将抛出异常.[..]
在C++ 11中,std::vector<T>::clear()标记为noexcept([n3290: 23.3.6/1]).
任何异常都~T可能被实现捕获,因此它clear()本身可能不会抛出任何东西.如果它们不存在,那么异常就是"意外"并终止进程而不是传播:
struct T {
~T() { throw "lol"; }
};
int main() {
try {
vector<T> v{T()};
v.clear();
}
catch (...) {
cout << "caught";
}
}
// Output: "terminated by exception: lol" (GCC 4.7.0 20111108)
Run Code Online (Sandbox Code Playgroud)
[n3290: 15.5.1]:在某些情况下,必须放弃异常处理以获得不太精细的错误处理技术.[..] - 当搜索处理程序(15.3)遇到函数的最外面的块时,带有no-except-specification,不允许异常(15.4)[...]
没有.
编辑:哎呀,不小心使用了N3126.下面的一些标准部分编号不好.
23.2.1p11:
除非另有规定(见23.2.4.1,23.2.5.1,23.3.2.3和23.4.1.4),本条款中定义的所有容器类型均满足以下附加要求:......
erase(),clear(),pop_back(),或pop_front()函数抛出异常.在23.4.1.4中,vector有例外erase(因为它可能需要复制或移动一些元素),但没有其他元素.
如果一个元素析构函数抛出clear(),它将导致std::unexpected().