这是有效的 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/