我使用C++ 11标准的代码转换的这个问题:C++ 11:转换const int的*为int *使用unordered_set ::推
#include<unordered_set>
struct B
{
int x, y;
};
class A
{
struct hash
{
std::size_t operator()(int* const a) const
{
return std::hash<int>()(*a);
}
};
struct equal_to
{
std::size_t operator()(int* const a, int* const b) const
{
return std::equal_to<int>()(*a, *b);
}
};
private:
std::unordered_set< int*, hash, equal_to > set;
public:
void push(const B& b)
{
set.insert(&b.x);
}
};
任何人都知道这是为什么?我可以解决在“push”参数中删除“const”修饰符的问题。但我不想要它,因为参数“b”没有被修改。
编辑:我简化了代码产生了一个未引用的地址。我做了一个结构B删除它。
这不是C11。 – 2013-05-13 19:02:23
投票重新开放。问题出在'set.insert(&a)'中,其中'a'的类型为'const int&'。 'a'的地址具有类型“指向const int的指针”,但是set对象正在寻找“指向(可修改)int”的指针。这种“常量”的混淆是相当普遍的,并且值得回答。 – 2013-05-13 19:06:47
与你的问题无关,但你正在存储一个对象的地址,该对象可能是你的设置中的一个临时对象。一旦传递给'push'方法的'a'超出了范围,那么地址是无效的,并且如果它被引用(通过您的'equal_to'方法),则可能导致堆损坏或应用程序崩溃。 – pstrjds 2013-05-13 19:08:47