可以矢量<T> :: clear throw?

sma*_*llB 17 c++ exception vector

是否有机会召唤std::vector<T>::clear()异常?

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)[...]

  • 我认为实例化`vector`的元素类型的一个要求是它的析构函数不抛出.如果违反了要求,则行为是未定义的,因此实现不需要`~T()`的异常. (3认同)

asc*_*ler 7

没有.

编辑:哎呀,不小心使用了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().


Vik*_*ehr 5

是的,如果T抛出的析构函数,否则没有.

更新: 似乎我错了; 在这种情况下,它只是崩溃了