1

ラムダ関数からパラメータを渡したいので、参照パラメータをラムダ関数にバインドします。ただし、関数を呼び出した後、外部変数は変更されません。ラムダ関数を外部変数のポインターにバインドすると、結果は正しいです。

テスト プログラムを次のように示します。参照渡しラムダ関数を既に定義しているのに、外部変数が変更されない理由を知りたい[&]ですか?

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main(int argc, char* argv[])
{
    string acc_ref, acc_ptr;
    //  define function via reference
    auto fProcRefEx = [&](string& acc, const string& s) -> void
    {
        acc += s;
    };
    auto fProcRef = bind(fProcRefEx, acc_ref, placeholders::_1);
    //  define function via pointer
    auto fProcPtrEx = [&](string* pacc, const string& s) -> void
    {
        (*pacc) += s;
    };
    auto fProcPtr = bind(fProcPtrEx, &acc_ptr, placeholders::_1);
    //  test
    vector<string> v = {"abc", "def"};
    for_each(v.begin(), v.end(), fProcRef);
    cout << "acc_ref: " << acc_ref << endl;  //  acc_ref is empty, wrong
    for_each(v.begin(), v.end(), fProcPtr);
    cout << "acc_ptr: " << acc_ptr << endl;  //  acc_ptr is "abcdef", correct
    return 0;
}
4

1 に答える 1