std function的引數和作為引數的問題

時間 2021-06-01 12:43:43

1樓:暮無井見鈴

std::function::function - cppreference.com

C++ concepts: Callable

這裡是接收可呼叫物件那個過載。對於 std::function ,要求是函式物件對於 char* 引數型別,和 void 返回型別「可呼叫」。

根據 Callable 要求。只要函式物件能接收 char* 引數且返回值能轉換成 void 就行。而 char* 能隱式轉換成 const char* 並傳遞,所以符合要求。

粗略地說,傳入函式物件的引數要求,可以比 std::function 模板引數的引數要求「更為限定」。

第二個問題大家都解釋了…

2樓:CodeTank

1、為什麼lamada裡面引數是const char* 卻能賦值給cb型別?

答:std::function是對可呼叫物件(如函式指標、lambda、實現了operator()的類)的通用封裝工具,它在初始化/賦值時儲存了乙個可呼叫物件,然後在std::

function::operator()中呼叫:

以上是std::function::operator()的實現原始碼。其實就是輪子哥 @vczh 回答的意思。

當你建立這樣乙個std::function物件時:

std::

function

(char*)

>cb=

(const

char*p

){};

會生成乙個長得差不多像這樣的std::function::operator():

_Ret

operator

(char*p

)const(p

);}顯而易見...char*轉const char*是沒問題的,反過來就不行了,第二個問題同理。

2、為什麼傳入引數的時候只能是char*型別?不能是const char*?(因為cb型別形參是char*? 那第乙個問題更說不通了)

答:char*可以轉為const char*,反過來不行。

3樓:kedixa

(可能是)發生了隱式型別轉換,就好比你可以把乙個char*毫無顧忌地賦值給乙個const char*一樣。

#include

#include

using

namespace

std;

typedef

function

(char*)

>FPc;

typedef

function

(const

char*)

>FPKc

;int

main();

FPcfpc=f

;// ok

FPKc

fpkc=f

;// ok

autof2=

(char*p

);fpc=f2;

// ok

// fpkc = f2; // error}但對於函式來說,這裡乍看上去似乎是反著的,你可以把乙個FPKc型別的函式賦值給FPc的函式,如果不能理解,請仔細想想函式呼叫的過程。

想了半天感覺自己說不清楚,要是你能理解的話,我就不接著說了。

C 11的std function作為函式引數時應該以哪種方式傳參?是否要視情況而定?

菊花三弄 如果你是想把function 放容器裡,用常量引用,插入容器的時候拷貝一次。如果你想把function 放到其他執行緒執行,用傳值 歐文韜 第二部分是std function的實現原理所以你就看你的場景能不能接受function的複製代價,不能的話就const reference,最省事 ...

spark submit的時候設定引數和通過SparkConf 設定引數是否等價?

兄嘚,你好像經常問 Spark 的問題啊 這個問題可以看官方文件得到答案的。Loading Configuration from a FileLoading default Spark configurations this way can obviate the need for certain ...

相機標定求外引數和slam 裡面求外引數有什麼區別?為什麼slam裡面求外引數不用標定的套路?

余世傑 相機標定求外參與slam求外參最大區別就是相機標定的時候有更多的先驗!一般都是用的棋盤格進行相機標定時,檢測到的特徵點很穩定,固定在乙個平面上,彼此之間的世界座標間隔都是相同的。而slam中特徵點同平面和特徵點之間世界座標間隔相同這兩個條件都是基本不成立的,不能做先驗,導致了slam的外參求...