Ich habe eine Klasse mit ein paar Felder, assignment c-tor
und move c-tor
:C++, wie zweideutig bewegen Bauer zu vermeiden
class A{
std::vector<int> numbers;
int k;
public:
A(std::vector<int> &&numbers, const int k):
numbers(numbers), // fast
k(k)
{
// logic
}
A(const std::vector<int> &numbers, const int k):
A(std::move(std::vector<int>(numbers)), k) // copy-and-move vector
{
// empty
}
};
Ich möchte logic
halten in einem c-tor
und es von anderen nennen. Auch ich möchte schnell move-semantics
unterstützen. Und ich muss explizit copy-and-move
Argumente in der assignment c-tor
.
Gibt es eine Möglichkeit, solche verschachtelte Konstruktion zu vermeiden und alle Vorteile, die ich oben aufgeführt habe, zu behalten?
Sie haben 'std :: move' vergessen, so dass Ihr Konstruktor mit dem' && 'tatsächlich eine Kopie erstellt. Sie müssen die Zuweisungsvariante nicht explizit kopieren und verschieben, da Sie nicht sicher sind, warum Sie das tun. –
@MooingDuck Warum? 'vector' hat einen' move c-tor', der 'std :: vector &&' als Argument akzeptiert. Warum sollte ich bereits verschobene Werte verschieben? –
LibertyPaul
@LibertyPaul Es hat einen Namen, also ist es ein lvalue: Sie brauchen std :: move, um es in den Aufruf von 'std :: vector()' –
kfsone