こんにちは。
不思議ですね。やってみました。確かにそのようになります。
原因は、unordered_map<>の要素の型違いです。
これのvalue_typeは、pair<const key_type,mapped_type>です。keyにconstがついてます。
しかし、for内で取り出す時のpairにつけていないため、一時オブジェクトが自動的に生成されてしまったのだと思います。(const参照は一時オブジェクトを受け取れますし。)
びっくりな頭の痛いミスですね。autoを使わなかったら私もハマると思います。
たぶん意図的にautoを使われていないのだと思いますが、autoを使った方が良いかも知れません。
c++
1#include <iostream>
2#include <unordered_map>
3#include <map>
4
5struct UserHoge
6{
7 int mNum;
8 UserHoge(int iNum) : mNum(iNum) { }
9};
10
11void foo(const std::unordered_map<uint64_t, UserHoge>& refUnorderedMap)
12{
13 // 引数で受け取ったstd::unordered_mapをstd::mapに詰め直す。
14 std::map<uint64_t, const UserHoge*> map;
15// for (const std::pair<uint64_t, UserHoge>& pair : refUnorderedMap)
16 for (auto&& pair : refUnorderedMap)
17 {
18 // UserHogeはポインタで渡す
19 map.emplace(pair.first, &pair.second);
20 //
21 // この時点ではmapに正しく格納されている
22 //
23 std::cout << "---- &pair.second=" << &pair.second << "\n";
24 for (const std::pair<uint64_t, const UserHoge*>& pair : map)
25 {
26 // 何かしら処理
27 std::cout << "[" << pair.first << "] "
28 << pair.second->mNum << " " << pair.second << "\n";
29 }
30 }
31 std::cout << "==========================\n";
32
33//
34// この時点で何ゆえかmapの全要素のUserHoge*が同じ値になっている。。。
35//
36
37 // std::mapをfor文で処理する
38 for (const std::pair<uint64_t, const UserHoge*>& pair : map)
39 {
40 // 何かしら処理
41 std::cout << "[" << pair.first << "] "
42 << pair.second->mNum << " " << pair.second << "\n";
43 }
44}
45
46int main()
47{
48 std::unordered_map<uint64_t, UserHoge> UnorderedMap;
49
50 UnorderedMap.emplace(1, UserHoge(100));
51 UnorderedMap.emplace(2, UserHoge(200));
52 UnorderedMap.emplace(3, UserHoge(300));
53
54 for (auto&& pair : UnorderedMap)
55 {
56 // 何かしら処理
57 std::cout << "[" << pair.first << "] "
58 << pair.second.mNum << " " << &pair.second << "\n";
59 }
60
61 foo(UnorderedMap);
62
63 return 0;
64}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/27 06:23
2016/12/27 06:40
2016/12/27 06:59