ich kürzlich gelesen (und leider vergessen, wo), dass der beste Weg Operator zu schreiben = ist wie folgt:expliziter Copykonstruktor oder implizite Parameter von Wert
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
statt dem:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
Die Idee ist, dass, wenn Operator = mit einem Rvalue aufgerufen wird, die erste Version die Konstruktion einer Kopie optimieren kann. Wenn also mit einem rvalue aufgerufen wird, ist die erste Version schneller und wenn sie mit einem lvalue aufgerufen wird, sind die beiden gleichwertig.
Ich bin neugierig, was andere Leute darüber denken? Würden die Leute die erste Version wegen mangelnder Deutlichkeit meiden? Habe ich Recht, dass die erste Version besser sein kann und niemals schlechter sein kann?
Was ist 'swap'? Wenn es 'foo temp = x ist; x = y; y = temp; 'Sie haben die unendliche Rekursion der Funktion' operator = 'und' swap'. –
Ich schrieb ein Programm, um die Theorie von @Alexey Malistov zu testen, und er war richtig - ich habe unendliche Rekursion. – nobar
Jede Klasse, die ein Kopier- und Swap-Idiom implementiert, kann nicht auf die Standard-Implementierung 'std :: swap' in ihrem Kopierzuweisungsoperator zurückgreifen. Das ist so ziemlich selbstverständlich. –