Rvalue referansları hakkında bu Visual C ++ blog makalesinden :
... C ++ geçici olarak geçişleri değiştirmenizi istemez, ancak değiştirilebilir bir değer üzerinde sabit olmayan bir üye işlevini doğrudan çağırmak açıktır, bu nedenle izin verilir ...
Temel olarak, geçici nesneler oldukları ve herhangi bir an ölecekleri için geçici olarak değiştirmeye çalışmamalısınız. Const olmayan yöntemleri çağırmanıza izin verilmesinin nedeni, ne yaptığınızı bildiğiniz ve bu konuda açık olduğunuz sürece (örneğin, reinterpret_cast kullanarak) bazı "aptal" şeyler yapmaya açık olmanızdır. Ancak, geçici olmayan bir referansa geçici olarak bağlanırsanız, nesneyi manipülasyonunuzun kaybolması için onu "sonsuza dek" geçirmeye devam edebilirsiniz, çünkü tamamen unutmuş olduğunuz bir yerde bu bir geçiciydi.
Ben olsaydım, işlevlerimin tasarımını yeniden düşünürdüm. Neden g () referansı kabul ediyor, parametreyi değiştiriyor mu? Hayır ise, bunu const referans yapın, eğer evet ise, neden geçici olarak geçmeye çalışıyorsunuz, değiştirdiğiniz bir geçici olduğunu umursamıyor musunuz? Neden getx () geçici olarak geri dönüyor? Gerçek senaryonuzu ve neyi başarmaya çalıştığınızı bizimle paylaşırsanız, bunu nasıl yapacağınıza dair bazı iyi öneriler alabilirsiniz.
Dile karşı çıkmak ve derleyiciyi kandırmak nadiren problemleri çözer - genellikle problem yaratır.
Edit: Yorum soruları adresleme: 1)
X& x = getx().ref(); // OK when will x die?
- Bilmiyorum ve umurumda değil, çünkü bu tam olarak "dile karşı" ile kastediyorum. Dil, "geçici referanslar, const referansına bağlı olmadıkça, ifadenin sonunda ölür, bu durumda referans kapsam dışına çıktığında ölür" der. Bu kuralı uyguladığınızda, x, bir sonraki ifadenin başında zaten ölü gibi görünüyor, çünkü const referansına bağlı değil (derleyici ref () 'nin ne döndürdüğünü bilmiyor). Ancak bu sadece bir tahmindir.
2) Amacımı açıkça belirtmiştim: sadece anlam ifade etmediği için geçici değişiklikleri değiştirmenize izin verilmiyor (C ++ 0x rvalue referanslarını göz ardı ederek). "Öyleyse neden const üyesi olmayan üyeleri aramama izin veriliyor?" iyi bir yanıt, ancak yukarıda belirttiğimden daha iyi bir cevabım yok.
3) X& x = getx().ref();
Açıklamanın sonunda ölmek konusunda x konusunda haklıysam , problemler açıktır.
Her neyse, sorunuza ve yorumlarınıza dayanarak bu ekstra cevapların bile sizi tatmin edeceğini sanmıyorum. İşte son bir girişim / özet: C ++ komitesi, geçici değişiklikleri değiştirmenin mantıklı olmadığına karar verdi, bu nedenle sabit olmayan referanslara bağlanmaya izin vermediler. Bazı derleyici uygulamaları olabilir ya da tarihi konular da dahil, bilmiyorum. Daha sonra, bazı özel durumlar ortaya çıktı ve her şeye rağmen, hala const olmayan yöntemi çağırarak doğrudan modifikasyona izin vereceklerine karar verildi. Ancak bu bir istisnadır - genellikle geçişleri değiştirmenize izin verilmez. Evet, C ++ genellikle bu kadar garip.