Test failed
-
Bin ich ein Esel?
#include <type_traits> std::result_of<void()>::type f() {} int main(){}
-
überleg dir mal, wie du result of nutzen würdest:
struct X { int operator() () { return 0; } }; result_of_t<X()> x = 42; //decltype(x) ist int!was ist aber "X()"? "X()" ist der typ einer funktion, die keine argumente übernimmt und ein X zurückgibt, also so etwas:
X foo () { }hier ist eine ganze ebene template-magie dahinter.
kurz: result_of versucht etwas über den return-type eines dings herausgefunden, für das ein operator() aufgerufen werden kann. dafür simuliert es, aus einem typ wieX(int)ein objekt vom typ X zu konstruieren (unter verwendung vondeclval) und darauf operator() mitdeclvals der funktionsparameter ausX(int)- in diesem fall int, in deinem fall - keine - aufzurufen.
da man aber void nicht - auch nicht perdeclvalals funktionsobjekt verwenden kann, haut das nicht hin und weil result_of SFINAE-freundlich ist, gibt es den typ "type" einfach nicht.das, was du offenbar willst, wäre ein simples:
decltype(void()) f () {}und nichts verrücktes:
using foo = int(*)(); result_of<foo()>::type i = 42;
-
Ah, krass.
Na das hätt ich jetzt echt nicht gedacht!
-
Du hast
result_ofmissverstanden: Es bestimmt nicht den Rückgabetyp eines Funktionstypen, sondern den Typ eines Ausdrucks:result_of_t<X(…)>ist der Typ eines Ausdrucks in dem eine Entität vom TypXmit Argumenten der Typen…aufgerufen wird. E.g.result_of_t<std::function<void(int)>(int)>istvoid.In deinem Fall hieße das, dass es eine Entität vom Typ
voidgibt, was nicht möglich ist.1 Möchtest du den Rückgabetyp einer Funktion extrahieren, wäre wohlstd::function<void()>::result_typeam simpelsten (ein eigenes alias template würde das aber deutlich verkürzen).1 und selbst wenn P0146 angenommen wird, kann man
voidnicht aufrufen.