Yanıtlar:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Bu, lvalue referans durumunda olduğu gibi sarkan bir referans döndürür. İşlev döndükten sonra, geçici nesne yok edilecektir. Sen dönmelidir Beta_ab
aşağıdaki gibi, değeriyle
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
Şimdi, geçici bir Beta_ab
nesneyi işlevin dönüş değerine doğru şekilde taşımaktır . Derleyici yapabilirse, RVO (dönüş değeri optimizasyonu) kullanarak taşınmayı tamamen önleyecektir. Şimdi aşağıdakileri yapabilirsiniz
Beta_ab ab = others.toAB();
Ve yapıyı geçici içine ab
taşıyacak veya bir taşıma veya kopyalama yapmayı tamamen ihmal etmek için RVO yapacak. Konuyu ve (N) RVO'nun bununla nasıl etkileşime girdiğini açıklayan BoostCon09 Rvalue References 101'i okumanızı tavsiye ederim .
Bir rvalue referansı döndürme durumunuz diğer durumlarda iyi bir fikir olabilir. getAB()
Genellikle geçici olarak başvurduğunuz bir işleve sahip olduğunuzu hayal edin . Rvalue geçicileri için sabit bir değer referansı döndürmesi optimal değildir. Böyle uygulayabilirsin
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
Not olduğunu move
çünkü bu durumda, isteğe bağlı değil ab
yerel bir otomatik ne de geçici rvalue de değildir. Şimdi, ref-niteleyici &&
ikinci işlevin rvalue geçicilerinde çağrıldığını ve copy yerine aşağıdaki hareketi yaptığını söylüyor
Beta_ab ab = Beta().getAB();
Bu olabilir biraz farklı bir bağlamda, örneğin, daha verimli:
template <typename T>
T&& min_(T&& a, T &&b) {
return std::move(a < b? a: b);
}
int main() {
const std::string s = min_(std::string("A"), std::string("B"));
fprintf(stderr, "min: %s\n", s.c_str());
return 0;
}
İlginç bir gözlem olarak, benim makinemde clang++ -O3
yukarıdaki kod için 54, normal için 62 talimat üretiyor std::min
. Bununla birlikte, bununla birlikte -O0
yukarıdaki kod için 518 talimat üretirken normal için 481 komut üretir std::min
.
for(:)
Dağıtımı kaldırılmış nesnede geçici nesne referansı kullandınız ve bu nesneyi bütünleştirdiniz. Düzeltme: ideone.com/tQVOal
std::move()
sadece konuyu daha net göstermek için açık bir kast olarak kullanılır. Projenize kopyalayıp yapıştıracağınız bir kod değil. En çok oy alan cevapla çelişmez, çünkü fonksiyonun içinde geçici bir nesne yaratılmıştır. Burada döndürülen nesne argümanlardan biridir (geçici nesneler, oluşturuldukları noktayı (sözcüksel olarak) içeren tam ifadeyi değerlendirmenin son adımı olarak yok edilir).