Ral*_*zky 4 c++ exception list default-constructor
我有一个(快速)查看C++标准和在线C++参考,但我找不到这个简单问题的答案:
可以std::list<int>
抛出默认构造函数吗?
如果是这样,为什么会抛出?
简短回答:它可以,但它可以以一种相当安全的方式实施:
默认构造函数构造一个空列表,因此几乎不需要在进程中实际分配内存.大多数列表实现不会为空列表分配任何内存.
然而,默认的构造函数是不是真的默认的构造函数,因为它有一个默认的说法:explicit list(const Allocator& = Allocator());
Allocator
本身就是一个模板参数,所以调用构造函数已经可以抛出,如果Allocator
有足够的哑巴(或复)实施提供一个投掷的默认构造函数,即如果构造默认参数抛出.
如果默认构造函数Allocator
不抛出,则提供一个std::list
默认构造函数不会抛出的实现也很容易.但是库实现者不需要这样做.
更新:将list
具有存储给定分配的副本以便在将来调用它.与我先前的声明相反,对复制构造函数的调用Allocator
可能不会抛出(§17.6.3.5,请参阅注释).该list
实施也不允许例如默认构造分配器和做在构造函数中的副本任务,因为这会破坏任何试图使用的任何代码list
与非默认-constructible分配器.