2016-05-16 25 views
1

this question中,OP聲稱main函數中的第三行將返回值std::bind轉換爲std::function是否有可能將std :: bind的返回值轉換爲std :: function而不進行構造?

但是,它看起來像一個簡單的構造函數調用給我。

實際上是否有合法的方法cast返回值std::bindstd::function沒有構造一個新的對象?

或者,是否將(std::bind)返回值的地址轉換爲std::function*然後通過引用它來調用它的kosher(而不是未定義的行爲)?

假設我知道std::function的適當模板參數。也就是說,假設它們是相同的模板參數,如果我們從std::bind的返回值構造std::function的實例,將會使用它們。

回答

2

標準將此稱爲具有功能符號的顯式類型轉換。本質上它用於構造指定類型的值。雖然它可能看起來像構造函數調用,但實際上沒有辦法直接在C++中調用構造函數。

是否有一種合理的方式來實際將std :: bind的返回值轉換爲std :: function而不構建新對象?

否。返回類型std::bind未指定;它可以返回任何東西,只要它提供了正確的操作和語義。您無法以便攜的方式將其視爲std::function

或者,它將std :: bind的返回值的地址強制轉換爲std :: function *,然後通過引用它來調用它(這是非未定義的行爲)嗎?

不,這是未定義的行爲。

0

類型std::bind表達式不同於std::function類型。在某些情況下,它甚至不能轉換爲std::function。所以,不,你不能構造綁定對象到std::function。但編譯器可以允許隱式轉換。

同樣適用於lambda表達式。

+3

在什麼情況下不能轉換?我目前的理解是,它總是可以轉換,但如果我誤解了我想知道的標準。 – merlin2011

+1

如果你通過'std :: move'綁定非拷貝類型的值(例如'std :: unique_ptr')。因此,綁定對象變成不可複製的,但是'std :: function'是。 –

相關問題