Betrachten Sie diese Klassen:
#include <iostream>
#include <string>
class A
{
std::string test;
public:
A (std::string t) : test(std::move(t)) {}
A (const A & other) { *this = other; }
A (A && other) { *this = std::move(other); }
A & operator = (const A & other)
{
std::cerr<<"copying A"<<std::endl;
test = other.test;
return *this;
}
A & operator = (A && other)
{
std::cerr<<"move A"<<std::endl;
test = other.test;
return *this;
}
};
class B
{
A a;
public:
B (A && a) : a(std::move(a)) {}
B (A const & a) : a(a) {}
};
Bei der Erstellung einer B
habe ich immer einen optimalen Vorwärtspfad für A
ein Zug für rvalues oder eine Kopie für lvalues.
Ist es möglich, das gleiche Ergebnis mit einem Konstruktor zu erreichen? Das ist in diesem Fall kein großes Problem, aber was ist mit mehreren Parametern? Ich bräuchte Kombinationen aus allen möglichen Vorkommen von lvalues und rvalues in der Parameterliste.
Dies ist nicht auf Konstruktoren beschränkt, sondern gilt auch für Funktionsparameter (z. B. Setter).
Hinweis: Diese Frage bezieht sich ausschließlich auf class B
; class A
dient nur zur Veranschaulichung, wie die Kopier-/Verschiebeaufrufe ausgeführt werden.