C++自修入門實境秀、C++ Primer 5版研讀秀 63/ ~ v10 泛用演算法(generic algorithms)10.3.3. ...
10.3.3. Lambda Captures and Returns
10.3.3 Lambda的捕捉與回傳
6:20
編譯器會為我們寫的一個lambda表達式做出一個新的不具名的類別型別來對應
For now, what’s useful to understand is that when we pass a lambda to a function, we are defining both a new type and an object of that type: The argument is an unnamed object of this compiler-generated class type. Similarly, when we use auto to define a variable initialized by a lambda, we are defining an object of the type generated from that lambda.
其實我們現在用到lambda都是作為演算法的引數,何來function、argument?可見演算法與函式的界線是很模糊的,可見二者有密不可分關係!或者說,演算法就是函式的一種特殊類型
就像一般類別一樣,lambda類別也會在建構它的執行個體時同時初始化它的資料成員(data member)
lambda類別的資料成員是用來承載它捕捉串列到的具名變數的
19:50
Capture by Value
捕捉其值(Capture by Value )
以值來捕捉來捕捉變數值
就像參數(引數)的傳遞,我們也可以藉由值或址的方式來(by value or by reference)捕捉一個變數
捕捉串列還是像參數列(parameter list)的功能嘛。
傳值(pass by value)就是copy拷貝
不一樣的地方在:
Unlike parameters, the value of a captured variable is copied when the lambda is created, not when it is called:
那麼就是在編譯期間就已經捕捉到了?
void fcn1() {
size_t v1 = 42; // local variable
// copies v1 into the callable object named f
auto f = [v1] { return v1; };
v1 = 0;
auto j = f(); // j is 42; f stored a copy of v1 when we created it
}
j並不是 f的拷貝,即j不是lambda,而是f的回傳型別與回傳其值
此v1是lambda f 的資料成員(data member)
此v1才是fcn1的資料成員(data member)(區域變數) 49:00
因為係拷貝copy才會各不相干
表10.1(頁395)列出了構成lambda捕捉串列(capture list)的各種方式
29:40
52:30 在 C語言中 「=」稱為「等號」或「等於的符號」,不要叫「等於」。「==」才是「等於」
號(符號)就是所謂的運算子啦
頁395
[] 除了作為下標運算子([]運算子,subscript operator),也作為lambda的捕捉串列(capture list)標識用
Table 10.1. Lambda Capture List
2:39:40
表10.1 : Lambda的捕捉串列
[] 空的捕捉串列。這個lambda不可以使用來自外圍函式的變數。一個 lambda只能在捕捉了之後才能使用區域變數。
[names] names是由逗號分隔的名稱所成的一個串列,這些名稱是外圍函式的區 域名稱。預設情況下,捕捉串列中的變數會被拷貝。前面接著&的名 稱會以參考捕捉。
[&] 隱含是以參考進行的捕捉串列。用在lambda主體中來自外圍函式的實體是透過參考來使用的。
[=] 隱含是以值進行的捕捉串列。在lambda中用到的,來自外圍函式的實 體會被拷貝到lambda主體中。
[&,identifier_list] indentifier_list是來自外圍函式的零或更多個變數所成的逗號分隔串列。 這些變數是以值來捕捉的,而隱含捕捉的任何變數都是以參考捕捉的。 identifier_list中名稱的前面必須接著一個&。
[=,reference_list] 包含在reference_list中的變數是以參考捕捉的,而任何隱含捕捉的變 數都是以值捕捉的。reference_list中的名稱不能包含this,而且前面必須接著一個&。
所以即使在捕捉串列中,前面接著「&」的名稱作會以參考來捕捉。因為在變數宣告時,參考型別標識符「&」也是冠在名稱之前,在型別名稱後。1:0:00
所以lambda的捕捉串列就像參數列一樣地捕捉引數,是傳址就用傳址(名稱前有&標識者),是傳值就用傳值
this這個特別的指標(pointer)也適用在lambda型別,因為它也要依其類別定義建構實例物件對象也。
1:22:00 Word VBA在文件標題樣式的段落中尋找文字 2:2:00在書籤中找字串,並到書籤位置 2:05:00 在同一段中,找二個字串
1:43:00 關閉 dwm.exe 桌面視窗管理員
留言