私は今しばらくの間、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コンパイラの問題ですか?私は他のものを試していない。
おっと、はい、持っていたビットこれは、なぜマップは値によって渡されることができない問題を、提起していますが... ...が溶融し、参照によって渡されたときに、私の例では、実際に動作しますか? – Benj
@Benj編集を参照してください。 – RedX
@Benj:値渡しすることができます。値はラムダのメンバになり、ラムダはデフォルトでconstなので、変更することはできません。変更したい場合は、変更可能と宣言してください。興味深いすなわち '[=](INT NUM)可変{}' –