simples decltype



  • Naja. (int*)(42) ist ein cast. Ist der ausgewertete Ausdruck ein temporary?


  • Mod

    Swordfish schrieb:

    Naja. (int*)(42) ist ein cast. Ist der ausgewertete Ausdruck ein temporary?

    Der ist zwar temporary, aber nicht in dem Sinne, den ich meine. Das hier will ich machen können:

    void foo(int);
    void bar(int*);
    
    int main()
    {
      foo(int()); // Kein Problem, temporärer int, value initialized
      bar(???);   // Wie temporären int* (value initialized) erzeugen?
    }
    

    Denn dann könntest du deinen ptrdiff_t mittels decltype(??? - ???) bekommen, ganz ohne Cast, nullptr oder new.

    Das muss doch irgendwie gehen, aber ich komm nicht drauf. Ich sehe schon, dass ich mir ganz dumm vorkommen werde, wenn gleich Arcoth oder camper mit der Lösung kommen 🙂

    edit: So langsam glaube ich, das geht gar nicht. Nach genügend Standardlektüre komme ich zu dem Schluss, dass "int*" ein elaborated type specifier ist. Aber als Typangabe für value initialization verlangt nach einem simple type specifier. Man müsste sich also vorher so etwas wie ein typedef auf int* machen, denn ein typedef gilt wieder als simple type specifier.



  • SeppJ schrieb:

    Man müsste sich also vorher so etwas wie ein typedef auf int* machen, denn ein typedef gilt wieder als simple type specifier.

    Das wär mein erster Tip gewesen. Plan B:

    template< typename T >
    T* get_ptr() { T t; return &t; }
    

    ... dereferenzieren will man das Ding ja sowieso nicht.

    //edit: "value initialized" ... ne, ich glaub das wird nix.
    //edihit: Nachdem unsere Standard-Cracks wohl schlafen geh' ich damit mal Leute auf SO ärgern ... http://stackoverflow.com/questions/28205578/how-to-create-a-temporary-value-initialized-t-in-standard-c


  • Mod

    bar(decltype(new int)());
    

    ist technisch gesehen nat. trotzdem kein temporäres Objekt. Dafür müsste bar eine Referenz nehmen.



  • Yay! Kauf' ich!

    //naja ... bis zur Kopie ists doch temporary. Vieleicht recht Sepp das ja schon 😉


  • Mod

    Ne, warum? Wenn Du vermutest, daß ich evtl. auf Leitungen rumsteh' dann gib mir doch bitte einen Pointer (<-pun intended) in welche Richtung ich mich drehen soll.

    Wen interessiert der Wert von sizeof blablub wenn du lediglich den Typ des Ausdrucks haben willst? 😕

    @SeppJ: Mit Zeigersyntax geht es nicht [expr.type.conv]/1:

    A simple-type-specifier (7.1.6.2) or typename-specifier (14.6) followed by a parenthesized expression-list constructs a value of the specified type given the expression list.

    simple-type-specifier sind entweder decltype(..) (wie von camper ausgenutzt), die keywords für Typen ( int , auto , usw.) oder qualified-ids.


  • Mod

    Swordfish schrieb:

    Yay! Kauf' ich!

    //naja ... bis zur Kopie ists doch temporary. Vieleicht recht Sepp das ja schon 😉

    Skalare rvalues sind keine Objekte. Das temporäre Objekt entsteht erst, wenn an die Referenz gebunden werden soll. Bei Klassen ist das anders.


  • Mod

    camper schrieb:

    Skalare rvalues sind keine Objekte.

    Formulier mal anders. Zumindest fuer xvalues stimmts nicht.


  • Mod

    Arcoth schrieb:

    camper schrieb:

    Skalare rvalues sind keine Objekte.

    Formulier mal anders. Zumindest fuer xvalues stimmts nicht.

    Sag doch gleich, dass ein p fehlt.


  • Mod

    camper schrieb:

    Arcoth schrieb:

    camper schrieb:

    Skalare rvalues sind keine Objekte.

    Formulier mal anders. Zumindest fuer xvalues stimmts nicht.

    Sag doch gleich, dass ein p fehlt.

    Wollt' ich auch, war mir aber nicht sicher ob die Aussage ueberhaupt sinnvoll ist. Ein skalarer Member einer Temporary ist doch ein Objekt?


  • Mod

    Arcoth schrieb:

    camper schrieb:

    Arcoth schrieb:

    camper schrieb:

    Skalare rvalues sind keine Objekte.

    Formulier mal anders. Zumindest fuer xvalues stimmts nicht.

    Sag doch gleich, dass ein p fehlt.

    Wollt' ich auch, war mir aber nicht sicher ob die Aussage ueberhaupt sinnvoll ist. Ein skalarer Member einer Temporary ist doch ein Objekt?

    Natürlich. Wenn du Worte auf die Goldwaage legen möchtest, sollte evtl. noch "ist" durch "verweist auf" ersetzt werden. Natürlich sind Ausdrücke sowieso keine Objekte...


  • Mod

    I.e. alles was du sagen wolltest war dass Wertkategorien Eigenschaften von Ausdrücken und nicht von Objekten sind? 🙄



  • Arcoth schrieb:

    Ne, warum? Wenn Du vermutest, daß ich evtl. auf Leitungen rumsteh' dann gib mir doch bitte einen Pointer (<-pun intended) in welche Richtung ich mich drehen soll.

    Wen interessiert der Wert von sizeof blablub wenn du lediglich den Typ des Ausdrucks haben willst? 😕

    omfg. Natürlich! Danke, ich hab' ständig unsinnigerweise in Werten gedacht wenn ich eigentlich nur an Typen interessiert war. 😮


Anmelden zum Antworten