我已经使用c++ 0x已有一段时间了,并且一直非常享受新的lamba函数功能。我已经习惯在lambda声明中指定[=],以表示我想按值将外部范围内的变量传递给我的lambda。
但是,今天我遇到了一个非常奇怪的lambda问题。我注意到在for_each期间按值将外部作用域映射传递到lamba会产生奇怪的效果。这是显示问题的示例:
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"));
}
});
}
可以从lamba内部调用许多map的方法(例如,查找),但是当许多其他方法在lamba外部正常编译时,会导致编译错误。
尝试使用[运算符会导致:
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)
尝试使用.insert函数会导致:
error C2663: 'std::_Tree<_Traits>::insert' : 4 overloads have no legal conversion for 'this' pointer
有谁了解这种不一致的行为?这是MS编译器的问题吗?我没有尝试过其他任何东西。
最佳答案
FYI [=]
通过值捕获,IIRC [&]
通过引用捕获。
http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/cpp/lin/cref_cls/common/cppref_lambda_lambdacapt.htm#cppref_lambda_lambdacapt
另请:C++0x lambda capture by value always const?