【发布时间】:2013-05-07 21:53:39
【问题描述】:
我有这个使用 c++11 标准的代码转换的问题:
#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 删除它。
【问题讨论】:
-
投票重新开放。问题出在
set.insert(&a)中,其中a的类型为const int&。a的地址类型为“指向 const int 的指针”,但 set 对象正在寻找“指向(可修改)int 的指针”。那种const的困惑很常见,值得回答。 -
与您的问题无关,但您存储的对象的地址可能是您集合中的临时对象。一旦传递给
push方法的a超出范围,地址就无效了,如果它被引用(比如你的equal_to方法),可能会导致堆损坏或应用程序崩溃。 -
你到底有什么问题?有错误信息吗?如果有,是什么?
-
不相关的问题:通过值传递 int 和通过 const ref 传递 int 有什么重要区别吗?
-
@maverik:在这种情况下没有相关差异
标签: c++ c++11 unordered-set const-cast