std :: list <int>的默认构造函数可以抛出吗?</int>

时间:2013-11-12 13:05:45

标签: c++ list exception default-constructor

我(快速)查看了C ++标准和在线C ++参考,但我找不到这个简单问题的答案:

std::list<int>的默认构造函数可以抛出吗?

如果是这样,为什么会抛出?

3 个答案:

答案 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分配空间来创建其内部结构,所以是的,它可能会抛出。