C 11中能否顯式宣告乙個lambda型別的變數,而不用auto

時間 2021-05-30 20:09:51

1樓:

所以,不存在符合標準的(不利用編譯器內部實現特徵)的顯式宣告lambda型變數的方法,是這樣嗎?

是。你可以寫個程式,用 typeid 列印出型別的名字看一下。

#include

#include

template

T>void

printType(T

obj)

intmain

());

printType

((){});

printType(0L

);return0;

}用 clang 編譯後執行輸出為:

Z4mainE3$_0

Z4mainE3$_1

l你看,即使是一樣的 lambda 表示式,它們的型別也是不同的。所以你只能用 std::function 一類的玩意把它包起來。

2樓:夕陽武士

1. 可以使用lambda初始化std:function型別的變數,但兩者型別是不一樣的。

2. 對於帶有capture的lambda,我將它看成乙個functor, 當然不能直接賦值給乙個函式指標。不帶capture 的lambda就像乙個普通函式,所以可以賦值。

3樓:藍色

沒辦法,只能auto,因為每乙個lambda都是獨一無二的,即使引數是相同的型別。

語言律師版的答案:

5.1.2/3The type of the lambda-expression(which is also the type of the closure object)is a unique, unnamed non-union class type— called the closure type — whose properties are described below.

This class type is not an aggregate (8.5.1).

The closure type is declared in the smallest block scope, class scope, or namespace scope that contains the corresponding lambda-expression. [..]

注意這裡的unique

4樓:熊起

沒用gcc,就是vs2013來說。lambda在沒有引用變數的時候可以被實現為乙個函式指標,在有引用變數的時候必然實現為過載了op ()的匿名物件。在這裡可以認為lambda只是1x標準之前早已支援的區域性物件的乙個語法糖。

有變數就是這貨的語法糖:

struct lambda;

lambda.v = i;

沒有就是封裝函式指標的語法糖

5樓:歐文韜

不用function之類的東東的話,不行。因為ISO要求lambda表示式的型別不能被顯式訪問。即便你使用了一些奇技淫巧訪問到這個型別,也很難保證跨編譯器的相容性。

因為各個編譯器的實現方法可能不太一樣。

所以只能用類似function的方式做內部複製,反正是可以move嘛

6樓:Cyandev

類似於 Objective-C 的 block 語法,它通過複製的方式隱式捕獲 scope 內的變數,那這些變數去哪了呢?它們都被儲存在乙個 struct 中,這個 struct 將作為引數傳遞到 block 體指標所指向的函式實現中被執行。當然如果外部變數用 __block 限定符宣告了可被 block 體修改,那其相應的指標也會被存放在 struct 中。

其實意思就是,這個我們稱之為匿名函式的東西一旦需要捕獲外部變數,那這個函式原有的簽名來作為最終真正執行的函式簽名肯定是不夠的,所以不能被賦值到單純相同的函式指標中。

7樓:

1. 可以,但是你需要正確的宣告type,例如std::

function

int)

>p=[=](inti)

->int;

要注意這裡的完整type是std::function,而不是int(*)(int)

2. 之所以捕獲時無法轉換是因為:std::

function模板本身在例項化時是生成了乙個進行過operator()過載的類例項。當沒有捕獲列表時,其內部的函式入口指標的封裝等價於傳統的函式指標。但是,當捕獲列表出現時,其入口包含了例項化時對捕獲物件的封裝,而這個捕獲物件的實體是以類成員的身份存在的,因此無法被轉化成函式指標。

乙個例子

intk=5

;int*p

=&k;

std::

function

int)

>func=[

p](inti

)->int;

cout

<

)<

;cout

<

)<

;程式的輸出結果是911

可以看到,在函式呼叫的時候,其捕獲列表並不會出現在引數列表中,但是卻真實的影響了實變數k。因此,在該function類例項中,指標p是作為乙個實際存在的類例項(func)的成員變數而真實存在的,而這種存在意味著在執行過載後的operator()時,需要有相應的this指標執行例項內部的member access,這也就決定了其類例項無法等價於函式指標。

8樓:boydfd

這裡面有解釋:item 5: 比起顯式的型別宣告,更偏愛auto

結論是,你無法自己寫出lambda的底層型別,但是可以用std::function來存放。

C 中如何判斷乙個變數的型別是否為指標?

我覺得題主應該是之前學過某種動態型別的語言 比如python js 想要學C C 於是才會有這個疑問吧?C或者C 屬於靜態型別語言,你一般不會遇到這個問題,至少目前應該是不會,因為乙個變數在傳遞過程中你必須要明確他的型別,那你怎麼可能不知道它是不是指標?比如說你在題目中說的 fun A 在C和C 中...

C 函式的返回型別宣告為乙個右值引用型別,會發生什麼事情?

Eric Qiang 很簡單,也就是乙個返回右值引用的函式出現在表示式中會有哪些 值型別 value category 的轉換?假設函式宣告為 int foo 1.當作右值,例如 2 foo 2.當作左值,例如 int k foo int L foo 具名的右值引用實際上是左值引用。因此與上一行語句...

c 在類內 宣告乙個新類 怎麼解決變數不完整的問題 宣告在hpp定義在cpp)

luckybat 這個問題的根源在於 不完全類,只能宣告為其他類的指標或引用 因為編譯器不知道不完全類的size,因此就不能處理包含它的類的size 而指標或引用的尺寸是固定的,都是sizeof void 建議不要這樣寫,我個人覺得特別彆扭呢 山楂山楂片 簡而言之,題主需要把CameraDevice...