c++ - unordered_set<reference_wrapper<Ty>> 有效吗?

标签 c++ reference c++11 hashset

这是有效的 C++(考虑到最新标准)吗?我在 Ubuntu 12.04 上遇到了 near-top-of-tree clang/libc++ 的编译错误。如果它应该是有效的,我会邮寄带有错误消息等的 clang-dev 列表。

#include <functional>
#include <unordered_set>

struct X
{
    int i; 
};

void f ()
{
    std::unordered_set<std::reference_wrapper<X>> setOfReferencesToX;

    // Do stuff with setOfReferencesToX
}

** 顺便说一句,我厌倦了限定问题/答案是特定于最新标准的。 C++ 社区作为一个整体,是否可以开始限定特定于旧标准的内容?较新的标准已经发布了大约一年。

最佳答案

此问题并非特定于 std::reference_wrapper<T> ,而是类型 X本身。

问题是 std::unordered_set要求您为 std::reference_wrapper<X> 定义散列和相等仿函数.您可以将哈希仿函数作为第二个模板参数传递。

例如,这会起作用:

#include <functional> // for std::hash<int>

struct HashX {
  size_t operator()(const X& x) const {
    return std::hash<int>()(x.i);      
  }
};

然后

std::unordered_set<std::reference_wrapper<X>, HashX> setOfReferencesToX;

另一种选择是对 std::hash<X> 进行特化:

namespace std {
template <>
struct hash<X> {
  size_t operator()(const X& x) const {
    return std::hash<int>()(x.i);      
  }
};
}

这允许您避免显式指定第二个模板参数:

std::unordered_set<std::reference_wrapper<X>> setOfReferencesToX;

关于相等比较,您可以通过为类 X 提供相等运算符来解决此问题:

struct X
{
  bool operator==(const X& rhs) const { return i == rhs.i; }
  int i; 
};

否则,您可以定义自己的仿函数并将其作为第三个模板参数传递。

关于c++ - unordered_set<reference_wrapper<Ty>> 有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11916133/

相关文章:

C++ 指针——它们什么时候被重新分配?

linux - 使用 C++11(Linux;clang 3.8)时 CUDA nvcc 编译器失败

c++ - std::add_pointer,try_add_pointer 在可能的实现中有什么用?

c++ - 发送 std::endl 到流给出内存地址

c++ - 为什么不能从 unique_ptr 构造weak_ptr?

c++ - 将函数结果分配给变量的问题

c++ - C++ 中静态引用

php - 如何在 Eclipse PHP 的工作区 (ctrl+shift+g) 中查找引用?

c++ - 如何在编译时交换可变参数模板的两个参数?

C++ 11/14 - 是否有用于在别处管理的资源的原始指针包装器?