2009-07-12 10 views

cevap

165
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(); 
+32

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. –

+17

:) Gerçekten, referans referansları lvalue referansları gibi "sadece referanslar" dır. hiçbir şeyi kopyalamaz veya saklamazlar. –

+0

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)). –

İlgili konular