C++ Academy · Ders

std::move ve std::forward

Lvalue'ları std::move ile rvalue'lara dönüştürün ve değer kategorisini std::forward ile koruyun

3. ders / 413 adım

std::move ve std::forward, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

İki Kuzen, Farklı Görevler

std::move ve std::forward derleme zamanında yapılan tür dönüşümleridir. Benzer görünürler, ancak farklı sorunları çözerler.

std::move: Her Zaman rvalue'ya Dönüştür

std::move(x), x'i koşulsuz olarak bir rvalue referansına dönüştürür. Böylece alan işlev kaynaklarını alabilir.

std::string s = "Hello";
std::string t = std::move(s);   // move-constructs t from s
// s is now in a valid-but-unspecified state

Move Ne Zaman Kullanılır?

std::move şu durumlarda kullanılır:

  • Taşıma kurucularında ve taşıma atama işleçlerinde
  • Bir yerel değişkeni taşımayı zorlamak istediğinizde döndürürken (nadiren gerekir; genellikle RVO uygulanır)
  • Artık ihtiyaç duymadığınız bir yerel değişkeni alan bir işleve geçirirken

std::move Uygulaması

Aslında kılık değiştirmiş bir static_cast'tir:

template <typename T>
typename std::remove_reference<T>::type&& move(T&& t) noexcept {
    return static_cast<typename std::remove_reference<T>::type&&>(t);
}

std::forward: Kategoriyi Koru

Bir yönlendirme referansı (T&&) kullanan bir şablonda std::forward<T>(x), x'i özgün kategorisine (lvalue veya rvalue) geri dönüştürür. Mükemmel iletim için kullanılır.

template <typename T>
void wrapper(T&& arg) {
    target(std::forward<T>(arg));  // forwards as lvalue or rvalue depending on T
}

Yönlendirme Neden Gereklidir?

Şablonun içinde parametrenin bir adı vardır; çağıran rvalue geçirmiş olsa bile bu parametre lvalue olur. std::forward, özgün kategoriyi geri kazandırır.

std::forward Olmadan

forward olmadan her bağımsız değişken, wrapper içinde lvalue olarak geçirilir ve çağıranın istediği taşıma semantiği etkisiz hâle gelir.

template <typename T>
void wrapper(T&& arg) {
    target(arg);    // always lvalue — wrong
}

forward için Şablon Parametresini Her Zaman Belirtin

std::forward<T>, açık şablon bağımsız değişkeninin belirtilmesini gerektirir. Bu bağımsız değişken olmadan davranış doğru olmaz.

Mükemmel İletim Örneği

Kurucu bağımsız değişkenlerini ileten bir fabrika işlevi, verimlilik için rvalue/lvalue ayrımını korur.

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

Bir Kez Taşıyın

Her nesne en fazla bir kez taşınmalıdır. Taşımadan sonra nesne geçerli ancak belirtilmemiş bir durumdadır; genellikle ona yeniden değer atar veya nesneyi yok edersiniz. Taşınmış bir nesneye önce yeniden değer atamadan erişmek, fark edilmesi zor hatalara yol açabilir.

Pratik Kurallar

Kısa bir zihinsel model:

  • Somut bir türünüz var ve onu taşımak istiyorsanız → std::move
  • Bir şablon parametreniz var ve kategoriyi korumak istiyorsanız → std::forward<T>

Hızlı Kontrol

T&& arg parametresine sahip bir şablon işlevinin içinde, lvalue/rvalue kategorisini koruyarak arg'ı nasıl iletirsiniz?

Özet

std::move, koşulsuz olarak rvalue'ya dönüştürür; kaynaklarını almak istediğiniz somut nesnelerde kullanın. std::forward<T>, genel şablonların içinde değer kategorisini korur; mükemmel iletim için kullanın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle C++ öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“std::move ve std::forward” dersi ücretsiz mi?

Evet — “std::move ve std::forward” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“std::move ve std::forward” dersinde ne öğreneceğim?

Lvalue'ları std::move ile rvalue'lara dönüştürün ve değer kategorisini std::forward ile koruyun C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“std::move ve std::forward” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Lvalue ve Rvalue Ayrımı
  2. Rvalue Referansları ve && Söz Dizimi
  3. std::move ve std::forward
  4. Taşıma Yapıcıları ve Taşıma Ataması
← C++ Academy Sayfasına Dön