1. 程式人生 > >C++11 lambda使用技巧小結

C++11 lambda使用技巧小結

在lambda中 一般的引數捕獲有

1.[=]值傳遞

2.[&]引用傳遞

官方文件寫傳值只能讀不能寫,但傳引用的話可以讀和寫。

如果增加mutable宣告, 則可以修改值傳遞的物件。

例1

j = 10;
	auto by_val_1 = [j]()mutable{ j++; cout << "lambda j: " << j << endl; };
	by_val_1();
	cout << "j: " << j << endl;

結果

lambda j: 11
j: 10

這個例子 lambda中通過嘗試修改變數j,並且輸出修改後的值顯示為11
但是 對於外部的變數j並沒有任何改動

因而得知  值傳遞帶mutable宣告雖然可以改變lambda中的物件, 但不會對外部變數產生影響

例2

class Obj
{
public:

	void TestFunc() { cout << "TestFunc" << endl; }

};
Obj obj1;
auto by_ref_func = [&]() 
	{ 
		cout << "by ref lam" << obj1.m_n1 << endl;
		obj1.TestFunc();
	};
	by_ref_func();

auto by_va_func = [=]()
	{
		cout << "by val lam" << obj1.m_n1 << endl;
		obj1.TestFunc();
	};
以上的程式碼無法通過編譯


在lambda內呼叫物件的普通函式 可以使用引用傳遞 

但普通的值傳遞不能  有兩種辦法解決

1 增加mutable宣告

auto by_val_lambda_func = [=]()mutable
	{
		cout << "by val lam" << obj1.m_n1 << endl;
		obj1.TestFunc();
	};
2 目標呼叫函式宣告為const
class Obj
{
public:

	void TestFunc() const { cout << "TestFunc" << endl; }

};