std :: vector默认构造函数是否可以抛出异常

Rae*_*ald 7 c++ stdvector bad-alloc noexcept

如果我std::vector使用默认构造函数(和默认分配器)构造一个空,它可以抛出异常吗?

通常,为容器的元素分配空间可以抛出异常(这将是一个异常std::bad_alloc).但一个默认的构造函数std::vector并不需要分配任何这样的空间.它可以在第一次插入或赋值时懒惰地分配一些空间.但是C++标准是否要求它不会抛出异常(暗示延迟分配,或者捕获std::bad_alloc然后再回到延迟分配)?

son*_*yao 13

它取决于默认的构造函数Allocator.默认构造函数std::vector声明为

vector() noexcept(noexcept(Allocator())); (since C++17)
Run Code Online (Sandbox Code Playgroud)

如果std::allocator使用那么它是noexcept(true); 即不会抛出异常.

allocator() noexcept; (since C++11)
Run Code Online (Sandbox Code Playgroud)

因此,在C++ 17之前,或者如果使用非默认分配器,则可以抛出异常.

  • 在C++ 17之前,vector的默认构造函数没有throw规范,这意味着它允许抛出.标准分配器也是如此.实际上,如果默认构造函数没有实际分配,它就不会抛出 - 这一直是常见的实现选择,即使没有特别要求. (6认同)