我有一个类,它需要一个std::unordered_set
包含不可复制、不可移动的实体对象,并且其哈希函数对实例的地址进行哈希处理。类似于以下内容:
class A
{
public:
A();
A(const A&) = delete;
A(A&&) = delete;
void operator=(const A&) = delete;
void operator=(A&&) = delete;
bool operator==(const A& other) { return this == &other; }
};
template<>
struct std::hash<A>
{
size_t operator()(const A& obj) const
{
return std::hash<A*>()(&obj);
}
};
class B
{
private:
std::unordered_set<A> entities;
};
如果emplace()
总是使用而不是insert()
,以这种方式使用是否安全unordered_set
?标准是否指定实现在构造节点对象后不能移动它们?
如果A
是可移动的呢?是否保证将在集合拥有的对象上调用散列函数,或者由于标准库更喜欢将所有内容视为值对象,是否允许在为insert
ed 对象分配存储之前对其进行散列?
作为最后的想法,我知道我可以通过使用来解决所有这些问题std::unordered_set<std::unique_ptr<A>>
,但我想为A
对象使用自定义分配器,并且我不想覆盖new
和delete
for A
。