2015-12-02 56 views
10

C++ 17將有一個Callable的概念,我想知道什麼是std::is_function<T>::valuetrue類型的確切區別。它們是否相同?一個是另一個的超集嗎?Callable概念和std :: is_function類型特徵之間有什麼區別?

+4

好吧,重載'operator()'的對象是可調用的,但不是函數 –

+0

@ M.M我想問題在於名稱。函數*是可調用的,但函數對象也是如此。這太糟糕了,沒有一個更好的名字......? – VermillionAzure

回答

13

C++ 17將有Callable概念

它的存在,因爲在C++ 11的標準。

它們是否等同?一個是另一個的超集嗎?

不,實際上它們是完全不相交的。 Callable僅適用於對象類型,幷包含從指針到成員的所有內容,以及帶有重載operator()的類型,並將其隱式轉換爲指向函數指針本身的函數指針。

is_function僅適用於實際功能類型,根據定義,該功能類型不是對象類型。

+1

'Callable'不適用於函數嗎? –

+0

@NeilKirk不,不符合標準。請參見[\ [func.wrap.func \]/2](http://eel.is/c++draft/func.wrap.func#2)(「F類型的可調用對象f是Callable ... 「),[\ [func.def \]/3-4](http://eel.is/c++draft/function.objects#func.def-3)(」可調用類型是函數對象類型或一個指向成員的指針,一個可調用對象是一個可調用類型的對象「),和[\ [function.objects \]/1](http://eel.is/c++draft/function.objects# 1)(「函數對象類型是可以作爲函數調用中的後綴表達式的類型的對象類型」) –

+2

LWG [可能調整這裏的措辭](http://wg21.link/lwg2393 ),但不會影響這個答案(除了可能將'Callable'重命名爲'Lvalue-Callable')。 –

相關問題