我(快速)查看了C ++标准和在线C ++参考,但我找不到这个简单问题的答案:
std::list<int>
的默认构造函数可以抛出吗?
如果是这样,为什么会抛出?
答案 0 :(得分:5)
简短回答:可以,但它可以以合理安全的方式实施:
默认构造函数构造一个空列表,因此几乎不需要在进程中实际分配内存。大多数列表实现不会为空列表分配任何内存。
但是,默认构造函数确实是默认构造函数,因为它有一个默认参数:explicit list(const Allocator& = Allocator());
Allocator
本身是一个模板参数,因此如果Allocator
具有足够愚蠢(或复杂)的实现提供抛出默认构造函数,则构造函数的调用可能已抛出,即如果抛出默认参数的构造。
如果 Allocator
的默认构造函数没有抛出,则提供std::list
的实现非常容易,其默认构造函数也不抛出。但是库实现者不需要这样做。
已更新: list
必须存储给定分配器的副本才能稍后调用。与我先前的声明相反,对Allocator
的复制构造函数的调用可能不会抛出(§17.6.3.5,请参阅注释)。也不允许list
实施例如default-构造分配器并在构造函数中执行复制赋值,因为这会破坏尝试将list
用于不具有默认构造的分配器的任何代码。
答案 1 :(得分:1)
C ++ 11标准将list
的默认构造函数声明为
explicit list(const Allocator& = Allocator());
,不包含noexcept
。因此,标准隐含地允许它抛出异常。
答案 2 :(得分:0)
它可能会通过new
分配空间来创建其内部结构,所以是的,它可能会抛出。