Verständnis der Conversion -Sequenz und der Rolle der Kopie Elision
Posted: 06 Feb 2025, 02:53
Ich würde gerne die Elisionsregeln der Kopie (falls dies derjenige sind, der angewendet wird) in einer Konvertierungssequenz während einer Direktinitialisierung von Objekten verstehen. überschreiben "> nicht materialisiert. Ich denke, dass prValue -Semantik ("Garanted Copy Elision") gilt. Ist es richtig? Code> Objekt kann in ein zu eins konvertiert werden und in Objekt hat keine direkte Konstruktion von Objekt. Ich beobachte die folgende Ausgabe:
< Blockquote>
vom Wertkonstruktor
von implizitem Konvertieren
zu Wert < /strong> Konstruktor
Von Destruktor < /p>
< /blockquote>
Zuerst hätte ich < /p>
vom Wertkonstruktor
von implizite Konvertierung
zu Bewegung < /strong> Konstruktor
vom Destruktor < /p>
< /blockquote>
/> Aber im Lichte von Zeile 1 kann ich (vorübergehend) zugeben, dass die Kopie Elision stattfindet, um den temporären zu zu entfernen, aber warum geht die Logik nicht weiter und entfernen auch das aus Objekt . "Kurzschluss" (ich bin unklar, weil diese Regeln für mich unklar sind). Nach dieser Linie des Argumentierens, wie in der Konvertierung, kann ich das vorübergehende zu Objekt materialisiert, und wenn es sich materialisiert, sollte die garantierte Elisionselisionsregel nicht mehr gelten?
Was sind also genau die Regeln, die in Zeile 2 gelten und warum?
Code: Select all
#include
class To {
public:
To() { std::puts("To default constructor"); }
explicit To(int Input) : val(Input) { std::puts("To value constructor"); }
To(To&& object) : val(object.val) { std::puts("To move constructor"); }
~To() { std::puts("To destructor"); }
int val = -1;
};
class From {
public:
explicit From(int Input) : val(Input) {
std::puts("From value constructor");
}
operator To() const {
std::puts("From implicit conversion");
return To{val};
};
~From() { std::puts("From destructor"); }
int val = -1;
};
int main() {
To obj0(To{42}); // 1
std::puts("--------------");
To obj1(From{42}); // 2
std::puts("--------------");
}
< /code>
Live < /p>
Zeile 1 gibt den Ausgang an: < /p>
, um Konstruktor zu bewerten
Es scheint, dass die Kopie der Elision einnimmt: Trotz seiner Konstruktions-Nebenwirkungen ist die temporäre zu {42}
< Blockquote>
vom Wertkonstruktor
von implizitem Konvertieren
zu Wert < /strong> Konstruktor
Von Destruktor < /p>
< /blockquote>
Zuerst hätte ich < /p>
vom Wertkonstruktor
von implizite Konvertierung
zu Bewegung < /strong> Konstruktor
vom Destruktor < /p>
< /blockquote>
/> Aber im Lichte von Zeile 1 kann ich (vorübergehend) zugeben, dass die Kopie Elision stattfindet, um den temporären zu zu entfernen, aber warum geht die Logik nicht weiter und entfernen auch das aus Objekt . "Kurzschluss" (ich bin unklar, weil diese Regeln für mich unklar sind). Nach dieser Linie des Argumentierens, wie in der Konvertierung, kann ich das vorübergehende zu Objekt materialisiert, und wenn es sich materialisiert, sollte die garantierte Elisionselisionsregel nicht mehr gelten?
Was sind also genau die Regeln, die in Zeile 2 gelten und warum?