Kopie mit auto innerhalb eines Ausdrucks?



  • Du veränderst etwas hinter einer const-reference?



  • Ich kenne dein problem, tritt bei mir auch immer wieder mal auf wenn ich expression templates verwende. Ich würde den Umweg über eine Funktion gehen.

    template<class T>
    T autocopy(T&& original){
        return original;//funktioniert das so? ich hab keine Ahnung von C++11
    } 
    
    someFunc( autocopy(getSomeResult()) );
    


  • cooky451:
    Habe ich nie gesagt. Es trifft nur je nach Parameter zufällig auf dasselbe. Um den Kontext kurz zu schaffen: In meinem Fall liefert getSomeResult() die ChildIndices eines Nodes, während someFunc Indices eines Nodes löscht. Zum Löschen wird aber der Vektor, der an someFunc übergeben wird, iteriert. Wenn ich mit Referenzen ohne Kopie arbeite, wird während dem Löschvorgang natürlich der durch getSomeResult zurückgegebene Vektor mit ChildIndices manipuliert, was aber die die Iteratoren in der Schleife über die zu löschenden Indices zerstört.

    otze:
    Ja, so was ähnliches hatte ich auch als Lösung im Kopf. Aber da die andere Variante eben auch nur ein Zweizeiler ist, sehe ich den großen Vorteil daran eher nicht.

    Dann aber eine andere Frage: Ich verstehe die Logik nicht, wieso auto nicht funktioniert. Eine Zeile:

    auto someThing = getSomeFunc();
    

    erzeugt ja auch eine Variable vom Typ des Rückgabewertes und schafft es gleichzeitig eine Zuweisung zu erreichen.

    Ebenso wie ich SomeType(func()) schreiben kann, um eine Kopie zu initialisieren, welche ich direkt an eine Funktion übergeben kann, dürfte es doch auch "theoretisch" möglich sein auto(func()) zu schreiben, die Informationen müssen dem Compiler ja ganz genau so vorliegen, spricht doch also nichts dagegen.

    Also das ist jetzt eine andere Frage. Dass mein Problem nicht mit Einzeiler gelöst werden kann, weiß ich jetzt. Aber was spricht gegen meine präferierte Syntax?



  • Es spricht nichts dagegen, es hat nur einfach niemand proposed. Schreib halt ein Proposal.



  • Wo kann ich das denn machen?

    Okay, das war leicht googlebar. Vielleicht mache ich das Mal, danke. 🙂



  • cooky451 schrieb:

    Du veränderst etwas hinter einer const-reference?

    Durchaus moeglich.

    template<class T>
    T autocopy(T&& original){
        return original;//funktioniert das so? ich hab keine Ahnung von C++11
    }
    

    Nein, das funktioniert nicht immer. T wird zum Referenztypen deduziert, falls das Argument kein rvalue ist.
    Loesung:

    template<class T>
    typename std::remove_reference<T>::type autocopy(T&& original)
    {
        return original;// funktioniert das so? ich hab keine Ahnung von C++11 (habe ich absichtlich stehen lassen :) )
    }
    

    (Ungetestet)
    Ich wuerde es uebrigens make_temporary nennen 🙂

    Das ist AFAICS auch die beste Loesung fuer einen Einzeiler (wobei ich sicher bin, das geht schooner).
    ⚠ Allgemein wuerde ich den zweizeiler vorziehen.


  • Mod

    Eisflamme schrieb:

    Aber was spricht gegen meine präferierte Syntax?

    Ich finde sie kryptisch und redundant.

    foo a, b = std::move(a);
    bar x, y = (auto&&)x; // ???
    


  • camper schrieb:

    Eisflamme schrieb:

    Aber was spricht gegen meine präferierte Syntax?

    Ich finde sie kryptisch und redundant.

    Deine Meinung ist kein Problem fuer mich.

    Edit: Das Beispiel war falsch, never mind.



  • Gut, hast schon Recht, dass man für fast alle Fälle Redundanz hat. Nur wenn man es so einsetzt, wie es nicht gedacht ist, ist dann das Argument wirklich stark? Und Kryptik... das ist bei C++ irgendwie mittlerweile für mich kein Argument mehr.

    In Deinem Beispiel würde halt eben erst der auto-Ausdruck und dann - basierend auf dem Resultat - die initiale Zuweisung an y erfolgen. Wo ist dort denn das Problem?

    Habe Mal versucht es im Proposal-Google-Forum zu posten. Ich finde den Beitrag aber nicht wieder. Vermutlich wird der geprüft oder es ist etwas schief gelaufen. Mal abwarten.



  • Wo ist dort denn das Problem?

    Es gibt keines.

    Und Kryptik... das ist bei C++ irgendwie mittlerweile für mich kein Argument mehr.

    Gerade wenn die Sprache doch schon kryptisch ist, sollte man darauf besonders achten. ⚠



  • Lass es leserlich und verständlich.


Anmelden zum Antworten