2012-08-11 94 views
6

这是有效的C++(考虑最新的标准)?在Ubuntu 12.04上,我收到了编译错误,接近顶端的clang/libC++。如果它应该是有效的,我会用错误消息等邮件给clang-dev列表。Is unordered_set <reference_wrapper <Ty>>有效吗?

#include <functional> 
#include <unordered_set> 

struct X 
{ 
    int i; 
}; 

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

    // Do stuff with setOfReferencesToX 
} 

**顺便说一下,我厌倦了排位问题/答案是特定于最新标准。作为一个整体,C++社区是否可以开始针对旧标准进行资格化?较新的标准已经出现了大约一年。

+1

+1结束笔记。 – Griwes 2012-08-11 16:07:29

+0

“整个C++社区是否可以开始针对旧标准进行资格认证?”不可以。鉴于无法升级到具有更完整C++ 11支持的编译器的用户数量庞大,更不用说某种编译器系列的普及了,它只是慢慢升级其对C++ 11的支持,而C++正在进行意味着C++ 03至少还有一年,如果不是两年的话。不要忘记,GCC和Clang都没有声称完全符合C++ 11。未来不是现在,假装它不会如此。 – 2012-08-11 20:38:20

回答

8

该问题不是特定于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; 
}; 

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

+0

不会专注'std :: hash'会简单一点吗? – Griwes 2012-08-11 16:08:29

+0

如果你愿意把东西放在'std'命名空间中,它会。 – juanchopanza 2012-08-11 16:10:32

+0

我不认为它应该被认定为“将东西放入'std'”,因为它仅仅是专业化的...... – Griwes 2012-08-11 16:11:46

相关问题