2017-12-14 17 views
1

ことなく値の変化を引き起こす::マップがマップは、STDでiterator->第二に割り当てる理由を私は理解していない参照

#include <typeinfo> 
#include <map> 
#include <iostream> 

int main() { 
    std::map<int, int> lol; 
    lol[2] = 33; 

    auto it = lol.find(2); 

    it->second = 91; // This changes the map's value 

    std::cout << typeid(it->second).name(); // This just shows 'int', not a reference 

    std::cout << lol[2]; // 91 

    return 0; 
} 

に値を変更しませんit->secondちょうどintでありリファレンスではない?

+0

'Typeid'は、それが参照かどうかを教えません。 –

+0

@JakeFreemanこちらのテクニックでも動作しませんhttps://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in​​-standard-c – Dean

+0

@Barry Indeed 、 ならない。それを編集するには遅すぎて、私はただそれを削除します。 –

答えて

1

it->secondではありません。参考ではありませんか?

はい、それはちょうどintです。 *itstd::pair<int const, int>&を返します。mapのノードの実際の値への参照です。しかし、secondへの会員アクセスは、実際にはintです。特性は「参照」であり、「割り当て可能」という特性は同等ではありません。非参照に割り当てることができます。また、割り当てることのできない参照があります。参照およびCVのでtypeid()はとにかくあなたに参照型を与えないだろう、と述べた

int i = 4; 
i = 5; // i is not a reference, but you can assign it here 

it->secondはあなたと同じように、通じ割り当てることができ、あなたのタイプint左辺値を与えますタイプの分析によって、修飾が削除されます。 my answer hereも参照してください。

は、おそらくあなたが見たいと思っているものはdecltype((it->second))です(括弧を二重にして、楽しみの倍にします)。実際には、式がintの左辺値であるため、int&が表示されます。

+0

私はノードをデリファレンスしていますので、直接値を修正しています。そうですか? – Dean

+0

@ダンはい、そうです。 – Barry

関連する問題