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 桌面視窗管理員


留言

熱門文章