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

Ral*_*zky 4 c++ exception list default-constructor

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

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

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

Arn*_*rtz 5

简短回答:它可以,但它可以以一种相当安全的方式实施:

默认构造函数构造一个空列表,因此几乎不需要在进程中实际分配内存.大多数列表实现不会为空列表分配任何内存.

然而,默认的构造函数是不是真的默认的构造函数,因为它有一个默认的说法:explicit list(const Allocator& = Allocator());
Allocator本身就是一个模板参数,所以调用构造函数已经可以抛出,如果Allocator有足够的哑巴(或复)实施提供一个投掷的默认构造函数,即如果构造默认参数抛出.

如果默认构造函数Allocator不抛出,则提供一个std::list默认构造函数不会抛出的实现也很容易.但是库实现者不需要这样做.

更新:list具有存储给定分配的副本以便在将来调用它.与我先前的声明相反,对复制构造函数的调用Allocator可能不会抛出(§17.6.3.5,请参阅注释).该list实施也不允许例如默认构造分配器和做在构造函数中的副本任务,因为这会破坏任何试图使用的任何代码list与非默认-constructible分配器.