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

时间:2018-05-16 09:29:55

标签: c++ stdvector noexcept bad-alloc

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

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

1 个答案:

答案 0 :(得分:13)

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

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

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

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

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