:rvalue reference ile daha verimli bir şekilde geri dönüyor mu? örneğin
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
:rvalue reference ile daha verimli bir şekilde geri dönüyor mu? örneğin
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Bu sadece lvalue referans durumunda olduğu gibi, bir sarkan başvuru verir. Fonksiyon döndükten sonra, geçici nesne imha edilir. Sen düzgün fonksiyonun dönüş değeri içine geçici Beta_ab
nesneyi hareket ediyor, Şimdi aşağıdaki
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
gibi değerle Beta_ab
dönmelidir. Derleyici, RVO (dönüş değeri optimizasyonu) kullanarak tümüyle hareket etmekten kaçınacaktır. Şimdi, aşağıdaki
Beta_ab ab = others.toAB();
yapabilirsiniz Ve ab
içine geçici inşa taşıyabilir veya bir hamle yaparak atlamak ya da tamamen kopyalamak RVO yapacağız. Konuyu açıklayan BoostCon09 Rvalue References 101'u okumanızı ve (N) RVO'nun bununla nasıl etkileşimde bulunacağını okumanızı tavsiye ederim.
Geçerli bir başvuruda bulunma durumunuz diğer durumlarda iyi bir fikir olabilir. Genellikle geçici olarak çağıran bir getAB()
işlevinin olduğunu düşünün. Bu, rvalue tempotations'lar için const lvalue referansı döndürmek için en uygun değildir. ab
yerel otomatik ne de geçici rvalue ne olduğu için, bu durumda move
isteğe bağlı olmadığını bu
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
Not gibi uygulayabilir. Şimdi, ref-eleme&&
İkinci fonksiyon hep döndürme türü iken sarkan referans problemi automagicallylar uzağa gitti üstlenmişti
Beta_ab ab = Beta().getAB();
kopyanın aşağıdaki hareket yapma, rvalue geçiciler üzerinde çağrılır söylüyor bir r değeri referansı. Bu beni ısırmadan önce düzeltti. Yığın smashing böcekleri emmek. –
:) Gerçekten, referans referansları lvalue referansları gibi "sadece referanslar" dır. hiçbir şeyi kopyalamaz veya saklamazlar. –
Ve kurucuları seçmese bile, derleyici bir şey sizin için otomatik olarak güvenle bir rvalue-ref dönebileceğini bilir. Örneğin, deneylerime göre, x dönüşü, 'return std :: move (x)' ile aynıdır. ('x' yerel bir değişkendir (yani yaptığım bu nokta, geçici olarak geri dönmekle ilgili orijinal soruya doğrudan uygulanmaz)). –