2017-08-26 69 views
1

我寫,所以我決定用G ++來看看幾個簡單的例子是傳遞給lambda表達式的引用代碼 - 7傳引用和指針lambda表達式

代碼:

int i = 2; 
auto f = [i]() { 
    printf("i = %d\n", i); 
}; 
printf("incrementing i to %d\n", ++i); 
f(); 

打印

incrementing i to 3 
i = 2 

如預期,因爲LAMDA使i副本後和:

int i = 3; 
int& j = i; 
auto g = [j]() { 
    printf("j = %d\n", j); 
}; 
printf("incrementing i to %d\n", ++i); 
g(); 

打印

incrementing i to 4 
j = 3 

尚未:

i = 4; 
int* k = &i; 
auto h = [k]() { 
    printf("*k = %d\n", *k); 
}; 
printf("incrementing i to %d\n", ++i); 
h(); 

打印

incrementing i to 5 
*k = 5 

現在通常引用的行爲一樣,不需要解除引用(且不能更改)的指針,但與lamda捕獲這並非如此。 這是標準的預期行爲,如果是這樣,爲什麼這與正常參考行爲有所不同?

+0

引用不像指針一樣行爲,它們的行爲與它們引用的對象相似。 '[j](){}'和'[i](){}'完全一樣。 – molbdnilo

+0

真正的東西,你還沒有設法瞭解,但與lambdas無關,但與參考。我最近寫了一個[小解釋](https://stackoverflow.com/a/45825892/6639082),我希望它能讓你更好地理解C++參考。 – WindyFields

回答

3

除非在捕獲中使用&,否則lambda表達式將按值捕獲。無論您是捕獲i還是j,除非您使用&i&j,否則該變量是按值捕獲的。

這與常規函數沒有區別。

void foo(int i) {} 
void bar(int& i) {} 

int i; 
int& j = i; 

foo(i); // Passed by value 
foo(j); // Passed by value also. 

bar(i); // Passed by reference 
bar(j); // Passed by reference also. 
0

要通過i作爲參考使用

auto f = [&i]() { 
    printf("i = %d\n", i); 
}; 

(請注意,在捕獲&前綴)

它不閹i關係最初宣佈作爲參考與否。