为什么c ++中的allocator需要一个拷贝构造函数?

Xia*_*Pei 11 c++ stl allocator

据说这里,这是因为异常规范的.我不明白.这个问题与异常规范有什么关系吗?

she*_*fly 9

阅读完本教程后,我对自己的措辞感到有些困惑.但我相信它就像这样简单:教程解释了为什么分配器的模板头显示

allocator(const allocator&) throw();

template <class U> allocator(const allocator<U>&) throw();

即使复制构造函数对于分配器来说相当无用.答案是分配器的规范不允许构造函数抛出异常.因此,复制构造函数公共接口定义了具有异常规范throw()(不抛出任何异常)的复制构造函数,以防止某人使用可能引发异常的复制构造函数派生自己的分配器.

请参阅此链接,以获得有关异常规范的详细说明,如果这是抛出的内容.(没有双关语.真的.)

因此,它们并不意味着在创建分配器时,您必须提供复制构造函数.他们只是指出规范明确禁止您定义抛出任何异常的规范.`

  • 恐怕你误会了。复制构造函数是绝对必需的,而且毫无用处。不允许抛出,但不要求有“noexcept”或“throw()”规范(尽管添加它是一个好主意。分配器必须是可复制构造的原因是容器类存储分配器的副本。(顺便说一句,我在标准中编写了大约 2/3 的分配器文本,从 C++11 开始,但分配器从一开始就要求是可复制构造的。) (2认同)