std::move
- C++ kursu
- Orta seviye
- Ders 101/116
- 5 dk
std::move ile taşıma semantiğini öğrenirsin.
std::move ile taşıma
std::move bir lvalue'yu rvalue'ya dönüştürür. Taşıma yapmaz; sadece taşıma yapılabilir hale getirir. #include <utility> başlığıyla gelir.
Örnek: std::string a = "Merhaba"; std::string b = std::move(a);. Burada std::move(a) ifadesi a'yı rvalue'ya çevirir ve std::string'in move constructor'ı çağrılır. b artık "Merhaba" içeriğine sahiptir; a geçerli ama belirsiz bir durumdadır (büyük olasılıkla boş). Bu, kopyalamadan hızlı içerik aktarımı sağlar.
std::move sonrası durum
std::move sonrası kaynak nesne geçerli ama belirsiz bir duruma gelir. İçeriği boşaltılmış olabilir; bu yüzden taşıma sonrası kaynak nesneyi kullanmamak gerekir.
Örnek: std::string a = "Merhaba"; std::string b = std::move(a); sonrasında a'ya güvenle yeni bir değer atayabilirsin: a = "Yeni";. Ama a'nın eski içeriğini okumamalısın. Bu, taşıma semantiğinin temel sözleşmesidir: kaynak nesne yok edilmez, sadece içeriği devredilir. Yeni değer atamak her zaman güvenlidir.
Uygulama std::move ile dizeyi taşı
Başlangıç kodunda a dizesi "Merhaba" içeriyor. std::move ile a'nın içeriğini b'ye taşı ve b'yi std::cout ile yazdır.
Başlangıç kodu
#include <iostream>
#include <string>
#include <utility>
int main() {
std::string a = "Merhaba";
// a'nın içeriğini b'ye taşı ve b'yi yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <string>
#include <utility>
int main() {
std::string a = "Merhaba";
std::string b = std::move(a);
std::cout << b;
return 0;
}Beklenen çıktı
Merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
std::move |
lvalue'dan rvalue'ya |
&& |
rvalue referans |
#include <utility> |
Başlık dosyası |
move constructor |
Kaynağı çalma |
2 std::move çağrısını tamamla
std::string b = std::____(a);
std::string b = std::move(a);
Açıklama: std::move lvalue'yu rvalue'ya çevirir.
3 std::move(a) ne yapar?
std::string a = "Merhaba";
std::string b = std::move(a);- a'yı siler
- a'yı kopyalar
- a'nın uzunluğunu verir
- a'yı rvalue'ya çevirir Doğru cevap
Açıklama: std::move a'yı rvalue'ya çevirir; taşıma sağlar.