2013-05-22 79 views
1

我想從lambda函數傳出一些參數,所以我將引用參數綁定到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; 
} 
+0

另外,'for(auto && str:v){fProcRef(str); }'和'std :: foreach(v.begin(),v.end(),fProcRef)'''一樣有效,並且通常更清晰。 – Yakk

回答

3

我認爲,當它存儲acc_refstd::bind將衰減引用只是一個普通的值類型。即在從綁定返回的未指定對象實例中,它將有一個成員string acc_ref,而不是string& acc_ref。您必須使用std::ref才能真正存儲參考:

auto fProcRef = bind(fProcRefEx, ref(acc_ref), placeholders::_1);