2015-12-02 16 views
10

C++ 17 avrà un concetto Callable e mi chiedevo quale fosse esattamente la differenza con i tipi per cui std::is_function<T>::value è true. Sono equivalenti? Uno è un superset dell'altro?Qual è la differenza tra il concetto Callable e i tratti del tipo std :: is_function?

+4

beh, un oggetto con overload 'operator()' è chiamabile, ma non una funzione –

+0

@ M.M Immagino che il problema sia dovuto al nome. Le funzioni * sono * callable, ma lo sono anche gli oggetti funzione. Peccato non ci sia un nome migliore ...? – VermillionAzure

risposta

13

C++ 17 avrà un Callable concetto

E 'lì nello standard dal C++ 11.

Sono equivalenti? Uno è un superset dell'altro?

No, in effetti, sono completamente disgiunti. Callable si applica solo ai tipi di oggetto e include tutto, dai puntatori ai membri ai tipi con un sovraccarico operator() per tipi con una conversione implicita ai puntatori di funzione ai puntatori di funzione stessi.

is_function è vero solo per tipi di funzione effettivi, che sono, per definizione, non tipi di oggetto.

+1

Non si applica anche alle funzioni "richiamabile"? –

+0

@NeilKirk No, non secondo lo standard. Vedi [\ [func.wrap.func \]/2] (http://eel.is/c++draft/func.wrap.func#2) ("Un oggetto callable f di tipo F è Callable ... "), [\ [func.def \]/3-4] (http://eel.is/c++draft/function.objects#func.def-3) (" Un tipo callable è un tipo di oggetto funzione o un puntatore al membro. Un oggetto callable è un oggetto di tipo callable. "), e [\ [function.objects \]/1] (http://eel.is/c++draft/function.objects# 1) ("Un tipo di oggetto funzione è un tipo di oggetto che può essere il tipo dell'espressione postfissa in una chiamata di funzione.") –

+2

LWG è [probabile che modifichi la dicitura qui] (http://wg21.link/lwg2393), ma non in un modo che influisce su questa risposta (eccetto forse rinominando "Callable" in "Lvalue-Callable"). –

Problemi correlati