1

我想从 lambda 函数中传递一些参数,所以我将引用参数绑定到 lambda 函数。但是,调用函数后,外部变量并没有改变。如果我将 lambda 函数与外部变量的指针绑定,结果是正确的。

我将测试程序显示如下,并想知道为什么外部变量没有改变,因为我已经定义了按引用传递的 lambda 函数[&]

#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

3

我认为std::bind在存储时会衰减对纯值类型的引用acc_ref。即在从bind 返回的未指定对象实例中,它将有一个成员string acc_ref,而不是string& acc_ref。您必须使用std::ref它才能真正存储参考:

auto fProcRef = bind(fProcRefEx, ref(acc_ref), placeholders::_1);
于 2013-05-22T04:53:40.720 回答