2015-12-02 5 views
10

C++ 17 wird ein Callable Konzept haben und ich fragte mich, was genau der Unterschied mit den Typen war, für die std::is_function<T>::valuetrue ist. Sind sie gleichwertig? Ist man ein Übersatz des anderen?Was ist der Unterschied zwischen dem Callable-Konzept und den Eigenschaften des Typs std :: is_function?

+4

Nun, ein Objekt mit überladenem 'operator()' ist aufrufbar, aber keine Funktion –

+0

@ M.M Ich denke, das Problem liegt mit dem Namen. Funktionen * sind * aufrufbar, aber auch Funktionsobjekte. Es ist schade, dass es keinen besseren Namen gibt ...? – VermillionAzure

Antwort

13

C++ 17 haben ein Callable Konzept

Es ist dort in der Standard-C++ seit 11.

Sind sie gleichwertig? Ist man ein Übersatz des anderen?

Nein, in der Tat sind sie völlig disjunkt. Callable gilt nur für Objekttypen und umfasst alles von Zeiger-zu-Mitglieder zu Typen mit einem überladenen operator() zu Typen mit einer impliziten Umwandlung in Funktionszeiger auf Funktionszeiger selbst.

is_function gilt nur für tatsächliche Funktionstypen, die definitionsgemäß keine Objekttypen sind.

+1

Gilt "Callable" nicht auch für Funktionen? –

+0

@NeilKirk Nein, nicht nach dem Standard. Siehe [\ [func.wrap.func \]/2] (http://eel.is/c++draft/func.wrap.func#2) ("Ein aufrufbares Objekt f vom Typ F ist Callable ... "), [\ [funcdef \]/3-4] (http://eel.is/c++draft/function.objects#func.def-3) (" Ein aufrufbarer Typ ist ein Funktionsobjekttyp oder ein Zeiger auf Member. Ein Callable-Objekt ist ein Objekt eines aufrufbaren Typs. "), und [\ [function.objects \]/1] (http://eel.is/c++draft/function.objects# 1) ("Ein Funktionsobjekttyp ist ein Objekttyp, der der Typ des Postfixausdrucks in einem Funktionsaufruf sein kann.") –

+2

LWG ist [passt wahrscheinlich den Wortlaut hier an] (http://wg21.link/lwg2393), aber nicht in einer Weise, die diese Antwort beeinflusst (außer vielleicht "Callable" in "Lvalue-Callable" umzubenennen). –

Verwandte Themen