我使用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