2011-06-08 12 views
3

私は今しばらくの間、C++ 0xのを使用してきたし、非常に多くの新しいラムダ関数施設を享受しています。私はラムダ宣言で[=]を指定することに慣れてきて、外部スコープの変数を値でラムダに渡したいことを示しています。なぜのstd ::マップが奇妙な動作しますか?

しかし、今日、私は非常に奇妙なラムダ問題に出くわしました。私はfor_eachの間の値でラムダに外部からスコープマップを渡すと、妙に働くことに気付きました。マップのメソッドの多くは、ラムダの内部から呼び出すことができ

void LambdaOddnessOne() 
{ 
    map<int, wstring> str2int; 
    str2int.insert(make_pair(1, L"one")); 
    str2int.insert(make_pair(2, L"two")); 

    vector<int> numbers; 
    numbers.push_back(1); 
    numbers.push_back(2); 

    for_each (numbers.begin(), numbers.end(), [=](int num) 
    { 
     //Calling find() compiles and runs just fine 
     if (str2int.find(num) != str2int.end()) 
     { 
      //This won't compile... although it will outside the lambda 
      str2int[num] = L"three"; 

      //Neither will this saying "4 overloads have no legal conversion for 'this' pointer" 
      str2int.insert(make_pair(3, L"three")); 
     } 
    }); 

} 

(例えば見つける。)しかし、彼らはラムダ外でうまくコンパイルしたいときに、他の方法の多くは、コンパイルエラーになった:ここでの問題を示し例です。生じ.insert機能を使用しようと

error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion) 

:例えば[演算子を使用しようとすると

がもたらした

error C2663: 'std::_Tree<_Traits>::insert' : 4 overloads have no legal conversion for 'this' pointer 

誰もがこの一貫性のない動作を理解していますか?それは単なるMSコンパイラの問題ですか?私は他のものを試していない。

答えて

7
+0

おっと、はい、持っていたビットこれは、なぜマップは値によって渡されることができない問題を、提起していますが... ...が溶融し、参照によって渡されたときに、私の例では、実際に動作しますか? – Benj

+0

@Benj編集を参照してください。 – RedX

+7

@Benj:値渡しすることができます。値はラムダのメンバになり、ラムダはデフォルトでconstなので、変更することはできません。変更したい場合は、変更可能と宣言してください。興味深いすなわち '[=](INT NUM)可変{}' –