std :: string的默认构造函数是否为throw?

Irf*_*rfy 3 c++ stdstring default-constructor c++03 nothrow

可以std :: string s; 在任何情况下扔?这是否受标准规范(对C++ 03感兴趣,如果存在差异)?

Ker*_* SB 5

在C++ 11中,默认构造函数实际上采用一个(默认)参数,即分配器(21.4.2):

explicit basic_string(const Allocator& a = Allocator());
Run Code Online (Sandbox Code Playgroud)

此构造函数未声明为noexcept.(我想这需要分配器有一个非抛出的复制构造函数.)正如Jonathan和Bo指出的那样,分配器的复制构造函数不能抛出任何异常,但是允许字符串的构造函数执行抛出操作(例如,分配一个初始值)一块记忆).当然可以编写一个类似字符串的类作为一个无抛出的constexpr构造函数,但标准的库字符串没有被指定为那样.

  • Allocator要求说分配器的拷贝构造函数"不应该通过异常退出"而`std :: allocator`的拷贝ctor是`noexcept` (2认同)
  • 允许字符串构造函数为字符串分配动态内存.那可能会导致'bad_alloc`.大多数实现没有,但你不能正式依赖它. (2认同)