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 之前,或者如果使用非默认分配器,则可能会抛出异常。
如果我使用默认构造函数(和默认分配器)构造一个空 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 之前,或者如果使用非默认分配器,则可能会抛出异常。