該標準是否定義了此代碼會發生什麼?在C++ lambda表達式中通過值捕獲是否需要將值與lambda對象一起復制?
#include <iostream>
template <typename Func>
void callfunc(Func f)
{
::std::cout << "In callfunc.\n";
f();
}
template <typename Func>
void callfuncref(Func &f)
{
::std::cout << "In callfuncref.\n";
f();
}
int main()
{
int n = 10;
// n is captured by value, and the lambda expression is mutable so
// modifications to n are allowed inside the lambda block.
auto foo = [n]() mutable -> void {
::std::cout << "Before increment n == " << n << '\n';
++n;
::std::cout << "After increment n == " << n << '\n';
};
callfunc(foo);
callfunc(foo);
callfuncref(foo);
callfunc(foo);
return 0;
}
的這個輸出與G ++是:
$ ./a.out
In callfunc.
Before increment n == 10
After increment n == 11
In callfunc.
Before increment n == 10
After increment n == 11
In callfuncref.
Before increment n == 10
After increment n == 11
In callfunc.
Before increment n == 11
After increment n == 12
是否要求由標準此輸出的所有特徵?
特別是,如果創建了一個lambda對象的副本,則所有捕獲的值也會被複制。但是,如果lambda對象通過引用傳遞,則不會複製捕獲的值。並且在函數被調用之前,沒有任何副本是由捕獲的值組成的,因此在調用之間會保留捕獲值的變化。
這些lambda等價類是否也有移動構造函數和移動賦值操作? – Omnifarious 2012-04-09 14:01:09
@Omnifarious:移動構造函數:「Maybe」(§5.1.2/ 19:「可能有一個隱式聲明的移動構造函數」)。 lambda沒有任何賦值操作符,它們被刪除。 – kennytm 2012-04-09 14:08:53