STL分配器复制构造函数要求的目的是什么

时间:2015-06-04 19:44:36

标签: c++ memory-management boost stl

STL对分配器设置了一些限制,包括以下内容: >

  
      
  1. a1 == a2 仅当分配器a1分配的存储可以通过a2解除分配时才返回true。建立反身,对称和传递的关系。不抛出异常。

  2.   
  3. a a(b)构造一个B(a)== b和A(b)== a。不抛出异常。 (注意:这意味着由rebind相关的所有分配器都保持彼此的资源,例如内存池)

  4.         

    http://en.cppreference.com/w/cpp/concept/Allocator

首先,我错误地将要求2解释为:" A a(b)构造一个a == b。"我认为这可能是一个常见的错误,但考虑到对2的正确解释,在哪些用例中它实际上是有用的?我想大多数时候复制构造函数体都是空的。例如,它可以用于复制文件指针以用于分配吗?

1 个答案:

答案 0 :(得分:0)

正如评论所指出的,分配器可以反弹到不同的类型。

大多数情况下,不同类型的分配器实例都有(隐式)转换,因此您可以将Alloc<void>传递到期望Alloc<int>的位置,反之亦然。

所以,当你这样做时

MyAlloc<int> ia;
MyAlloc<double> da;

bool equivalent = (ia == da);

你实际上最终要做的是

bool equivalent = operator==(ia, da);

除非存在da的异构重载,否则会隐式地将MyAlloc<int>转换为operator==

要求指定要求实现显式将rhs分配器转换为相同的分配器类型。这个

  • 避免意外地遇到operator==
  • 的异构重载 即使转换构造函数标记为explicit
  • 仍然有效。
bool equivalent = operator==(ia, MyAlloc<int>(da)); // or:
bool equivalent = operator==(da, MyAlloc<double>(ia)); // or:

同时,这允许不同类型的分配器仍然比较非等效

¹需要检查是否将其指定为要求