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

Can the std::vector default constructor throw an exception

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

一般来说,为容器的元素分配 space 会引发异常(即 std::bad_alloc)。但是 std::vector 的默认构造函数 不需要 分配任何这样的 space;它可以在第一次插入或赋值时延迟分配一些 space 。但是C++标准是否要求不抛出异常(暗示惰性分配,或者捕获std::bad_alloc然后回退到惰性分配)?

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

vector() noexcept(noexcept(Allocator())); (since C++17)

如果使用 std::allocator 则为 noexcept(true);即不会抛出异常。

allocator() noexcept; (since C++11)

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