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?
risposta
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.
Non si applica anche alle funzioni "richiamabile"? –
@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.") –
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"). –
beh, un oggetto con overload 'operator()' è chiamabile, ma non una funzione –
@ 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