我快速浏览了C ++标准和在线C ++参考,但是找不到这个简单问题的答案:
默认构造函数可以std::list<int>
抛出吗?
如果是这样,为什么会抛出?
简短的回答:可以,但是可以以相当安全的方式实现:
默认构造函数构造一个空列表,因此几乎不需要在进程中实际分配内存。大多数列表实现不会为空列表分配任何内存。
然而,默认的构造函数是不是真的默认的构造函数,因为它有一个默认的说法:explicit list(const Allocator& = Allocator());
Allocator
本身就是一个模板参数,所以调用构造函数已经可以抛出,如果Allocator
有足够的哑巴(或复)实施提供一个投掷的默认构造函数,即默认参数的构造是否抛出。
如果的默认构造函数Allocator
不抛出,那么提供一个std::list
默认构造函数也不会抛出的实现非常容易。但是库实现者并不需要这样做。
更新:将list
具有存储给定分配的副本以便在将来调用它。与我先前的主张相反,对的副本构造函数的调用Allocator
可能不会抛出(第17.6.3.5节,请参见注释)。该list
实现也不允许例如默认构造分配器并在构造器中进行拷贝分配,因为这会破坏任何试图list
与不能默认构造的分配器一起使用的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句