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?