Test failed



  • Bin ich ein Esel?

    #include <type_traits>
    
            std::result_of<void()>::type f() {}
    
            int main(){}
    

    http://ideone.com/sGXeR8



  • ü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 wie X(int) ein objekt vom typ X zu konstruieren (unter verwendung von declval ) und darauf operator() mit declval s der funktionsparameter aus X(int) - in diesem fall int, in deinem fall - keine - aufzurufen.
    da man aber void nicht - auch nicht per declval als 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!


  • Mod

    Du hast result_of missverstanden: 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 Typ X mit Argumenten der Typen aufgerufen wird. E.g. result_of_t<std::function<void(int)>(int)> ist void .

    In deinem Fall hieße das, dass es eine Entität vom Typ void gibt, was nicht möglich ist.1 Möchtest du den Rückgabetyp einer Funktion extrahieren, wäre wohl std::function<void()>::result_type am simpelsten (ein eigenes alias template würde das aber deutlich verkürzen).

    1 und selbst wenn P0146 angenommen wird, kann man void nicht aufrufen.


Anmelden zum Antworten