如果我使用默认构造函数(和默认分配器)构造一个空std::vector
,它是否可以抛出异常?
通常,为容器元素分配空间可能会抛出异常(这将是std::bad_alloc
)。但是std::vector
的默认构造函数不需要来分配任何此类空间;它可以在第一次插入或赋值时懒惰地分配一些空间。但是C ++标准是否要求它不会抛出异常(暗示延迟分配,或者捕获std::bad_alloc
然后再回到延迟分配)?
答案 0 :(得分:13)
这取决于Allocator
的默认构造函数。 std::vector
的默认构造函数声明为
vector() noexcept(noexcept(Allocator())); (since C++17)
如果使用的是std::allocator
,那么noexcept(true)
;即不会抛出异常。
allocator() noexcept; (since C++11)
因此,在C ++ 17之前,或者如果使用非默认分配器,则可以抛出异常。