std::move (tsz. std::moves)
std::move
a C++11-ben bevezetett standard könyvtári függvény, amely nem mozgat semmit — csak egy rvalue-re konvertál (azaz az érték átmeneti jellegét deklarálja a fordítónak). Ezáltal engedélyezi, hogy egy objektum erőforrásai áthelyezhetők legyenek egy másik objektumba.
template<typename T>
typename std::remove_reference<T>::type&& move(T&& arg) noexcept;
Ez egy univerzális referencia (T&&), amit egy rvalue-referenzává alakít. A move
tehát egy cast, nem más.
#include <iostream>
#include <string>
#include <utility> // std::move
int main() {
std::string a = "alma";
std::string b = std::move(a);
std::cout << "b = " << b << "\n"; // alma
std::cout << "a = " << a << "\n"; // üres vagy undefined állapot
}
Mi történt?
std::move(a)
jelzi a fordítónak, hogy a
-t lehet „ellopni”b
move konstruktorral átveszi a
erőforrásaita
megmarad, de már nem használható érdemben (definiált, de üres vagy érvénytelen állapotban van)
std::vector
, std::string
, stb.)
std::move
nem mozgatstd::move
csak annyit mond: “én ezt nem használom többet, nyugodtan vedd el tőlem.”
A tényleges mozgatást a move konstruktor vagy a move értékadó operátor végzi.
std::string s1 = "alma";
std::string s2 = s1; // másolat
Ez itt másolás, nem mozgatás.
Ha viszont így írod:
std::string s2 = std::move(s1); // mozgatás
A s2
megkapja az erőforrást, a s1
pedig üres marad.
class MyClass {
std::string name;
public:
MyClass(std::string n) : name(std::move(n)) {} // mozgatjuk a stringet
};
Elem | Jelentés |
---|---|
std::move(x)
|
Lvalue → Rvalue cast |
Cél | Mozgathatóvá tenni egy változót |
Mire jó? | Erőforrásátadás, hatékony teljesítmény |
Tényleges munka | Move konstruktor vagy move operátor végzi |