我已经使用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?

09-06 20:07