Soru Std :: drop constness devam etmeli mi?


Aşağıdaki kod MSVC2010'da derleniyor ve çalışıyor mu?

const std::string s = "foo";
std::string s2(std::move(s));

Bunun muhtemelen bir şeyleri kırmayacağını anlayabiliyorum çünkü s'nin içsellerini alıyorum, kimsenin onu kullanamayacağını bilmeliyim, bu yüzden kurumu düşürdüğümden önemli değil. Ancak derleyicinin ROM'daki (gömülü bir uygulamada) const nesneleri nasıl uygulandığı hakkında ne olacak? Hareket daha sonra bir kopyaya dönüşecek mi? Ya da MSVC bana bir hata mı vermeli?


25
2018-02-21 13:33


Menşei


Belki bazı optimizasyon nedeniyle derleniyor? - SomeWittyUsername
@icepack no, derleme, özellikle const doğruluğu vb. kontroller optimizasyondan önce gelir. - Arne Mertz
@icepack optimizasyonun altın kuralı as-if kuralıdır. Derleyici, uygulanmadıkları takdirde davranmayan (gözlemlenebilir davranışlar ve dilde yapılan kurallar dahilinde) davranmayan iyileştirmeler yapamazlar. - R. Martinho Fernandes


Cevaplar:


bence std::move(T const&) sadece döner T const &&. Yani, aslında taşınmaz (hareket atama operatörleri / yapıcılar param tipine uymadığından).

Ne olur, kurucu alıyor T const& eşleşir lvalue ( değişken yazılan T const &&) ve bu şekilde, hareket bir kopyaya dönüşür.


30
2018-02-21 13:35



@AndyProwl, burada bir şey sorduğum zaman, cevap vermek için var gibi duruyor :) tıpkı bir koruyucu meleğin inek şekli gibi;) - odinthenerd
@PorkyBrain: Bu çok yanlış geliyor: D - Andy Prowl
@KerrekSB geçici olsa da (referanslar nesne değildir). Fakat std::move(...) bir xvalue ve const& xvalues'a bağlanabilir. - R. Martinho Fernandes
PorkyBrain / @ ArneMertz Bir tweet'e yoğunlaştırmak bir meydan okumaydı: twitter.com/sehetw/status/304587287046541312 - sehe
@KerrekSB evet, az ya da çok. xvalues ​​hem glödem hem de rezonanslardır, bu yüzden hem ref.de hem de lvalue refs'lerine bağlanabilirler (ancak aşırı yüklerin giderilmesinde IIRC rnue refs'ler tercih edilir, bu yüzden ilk olarak seçilirler). - R. Martinho Fernandes


Bu fark yok

const std::string f() { return "foo"; }
std::string s2 = f();

Bu, bir kerede C ++ 03'ü önerdi ve Komite mola rvalue referanslar sunarken bu kod. Sadece bir kopyanın içine düşüyor.


23
2018-02-21 13:37



Kapalı bir hareket durumunun güzel karşılaştırması. +1 - sehe
Mantık için +1 - Cheers and hth. - Alf
+1 çok kötü Birden çok yanıtı kabul edemiyorum - odinthenerd
Nasıl farklı yok? OP'nin post s2'sinde (casted) rvalue referansı kullanılarak oluşturulmuştur ve bu s2'de rıhtımın kendisi bulunmaktadır. - texasbruce
@texasbruce: OP'de, oyuncu yok. std::move aynen bir fonksiyon f() bu örnekte. Bu nedenle, her iki durumda da s2, işlevin kendisinin dönüş değeriyle başlatılır. - MSalters