acpl::moveOwnership bietet im Gegensatz zu std::move den Vorteil, dass ein move-from const Variablen einen Fehler zur Compilezeit erzeugt.
Zwei Beispiele sollen ownership transfer verdeutlichen.
Daten in ein Type moven und dort speichern.
#include <core/util/functional.hpp> struct Node {}; struct Edge {}; struct Graph { std::vector<Node> nodes; std::vector<Edge> edges; Graph(std::vector<Node>&& nodes, std::vector<Edge>&& edges) : nodes(acpl::moveOwnership(nodes)), edges(acpl::moveOwnership(edges)) { } }; void func() { std::vector<Node> nodes; std::vector<Edge> edges; // ... fill nodes and edges // graph is the new ownership of nodes and data Graph graph(acpl::moveOwnership(nodes), acpl::moveOwnership(edges)); assert(nodes.empty()); assert(edges.empty()); }
Daten entweder kopieren oder durch eine Funktion moven.
#include <core/util/functional.hpp> template<typename Container> inline std::vector<int> copyOrMove(Container&& x) { Container data2(std::forward<Container>(x)); return data2; } void func() { std::vector<int> x {1,2,3}; std::vector<int> copy = copyOrMove(x); assert(not x.empty()); std::vector<int> moved = copyOrMove(acpl::moveOwnership(x)); assert(x.empty()); }
Move von const Variablen ist nicht möglich, da die Variablen geändert werden würden, was nicht möglich ist, weil sie const sind.
void func() { const std::vector<int> x {1,2,3}; std::vector<int> moved = acpl::moveOwnership(x); // error: static assertion failed: Move from const variables dosent make sense }