我(快速)研究了 C++ 标准和在线 C++ 参考,但我找不到这个简单问题的答案:
可以的默认构造函数std::list<int>
throw?
如果是这样,为什么会抛出?
简短回答:它can,但它可以以相当安全的方式实现:
默认构造函数构造一个空列表,因此几乎不需要在进程中实际分配内存。大多数列表实现不会为空列表分配任何内存。
但是,默认构造函数不是really默认构造函数,因为它有一个默认参数:explicit list(const Allocator& = Allocator());
Allocator
本身是一个模板参数,所以call构造函数可能已经抛出,如果Allocator
有一个足够愚蠢(或复杂)的实现,提供一个抛出默认构造函数,即如果默认参数的构造抛出。
If的默认构造函数Allocator
不抛出,提供一个实现相对容易std::list
它的默认构造函数也不会抛出。但库实现者不需要这样做。
Updated: The list
必须存储给定分配器的副本以便以后能够调用它。与我之前的说法相反,对复制构造函数的最终调用Allocator
不能抛出(§17.6.3.5,参见评论)。这list
也不允许实施,例如默认构造分配器并在构造函数中进行复制分配,因为这会破坏任何尝试使用分配器的代码list
使用不可默认构造的分配器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)