STL对分配器设置了一些限制,包括以下内容: >
a1 == a2 仅当分配器a1分配的存储可以通过a2解除分配时才返回true。建立反身,对称和传递的关系。不抛出异常。
- 醇>
a a(b)构造一个B(a)== b和A(b)== a。不抛出异常。 (注意:这意味着由rebind相关的所有分配器都保持彼此的资源,例如内存池)
首先,我错误地将要求2解释为:" A a(b)构造一个a == b。"我认为这可能是一个常见的错误,但考虑到对2的正确解释,在哪些用例中它实际上是有用的?我想大多数时候复制构造函数体都是空的。例如,它可以用于复制文件指针以用于分配吗?
答案 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:
同时,这允许不同类型的分配器仍然比较非等效。
¹需要检查是否将其指定为要求