SORU
14 EKİM 2009, ÇARŞAMBA


Nasıl olmayan sabit bir referans geçici bir nesne için bağlanamıyor?

Neden geçici bir nesne, olmayan sabit referans almak için izin değil getx() döndürür ki? Açıkça, bu C Standart tarafından yasaklanmıştır ama bu sınırlamanın amacı, merak ediyorumbir referansstandart.

struct X
{
    X& ref() { return *this; }
};

X getx() { return X();}

void g(X & x) {}    

int f()
{
    const X& x = getx(); // OK
    X& x = getx(); // error
    X& x = getx().ref(); // OK
    g(getx()); //error
    g(getx().ref()); //OK
    return 0;
}
  1. Nesne olamaz ömrü neden, çünkü açıktır bir nesneye sabit bir referansyasak değilC Standart.
  2. Sabit olmayan işlevleri için çağrılar izin verilir, çünkü geçici nesne örneğinde sürekli üstünde olduğunu ifade etti. Örneğin, ref() geçici nesneyi değiştirebilir.
  3. Buna ek olarak, ref() derleyici aptal ve bu geçici nesne için bir bağlantı sağlar ve bu sorunumuzu çözer.

Ek olarak:

Derler ki "sabit referans için geçici bir nesne atama bu nesnenin ömrü uzatır" ve " hiçbir Şey olmayan sabit başvurular hakkında ancak," dedi". Benimek soru. Aşağıdaki atama geçici nesnenin ömrü uzatmak mı?

X& x = getx().ref(); // OK

CEVAP
14 EKİM 2009, ÇARŞAMBA


Visual C blog article about rvalue references Bu:

... C seni istemiyor yanlışlıkla geçici değiştir, ama doğrudan olmayan sabit üye arama fonksiyonu değiştirilebilir bir rvalue açık, izin verdi

Temelde, geçici nesneler çok sebepten geçici değiştirmeye çalışmamalısın ve her an ölecek. Sebebi sensin izin çağrısı olmayan sabit yöntem olduğunu, iyi, hoş biraz "aptalca" şeyler olarak ne yaptığını biliyor ve sen açık hakkında (gibi kullanarak reinterpret_cast). Ama eğer bir bağlama geçici olmayan bir sabit başvuru yapabilirsiniz tutmak geçen etrafında "sonsuza kadar" sadece senin manipülasyon nesnesi yok, çünkü bir yerlerde seni tamamen unutmuşum bu geçici.

Eğer senin yerinde olsaydım, benim fonksiyonların tasarımını yeniden düşünmek olur. Neden g() referans kabul ederken, parametre değiştirmek mi? Hayır, Evet, neden geçici olarak geçmek için uğraşıyorsun eğer referans inş, eğer karar değiştiriyorsunuz geçici bir durum umurunda değil mi? Neden getx() geçici zaten? dönen Eğer bizimle başarmak için çalışıyoruz ne gerçek senaryo ve paylaşırsanız, bunu yapmak için bazı iyi öneriler alabilirsiniz.

Dili karşı gelmek ve derleyici kandırmak nadiren sorunlarımız oluşturur genellikle çözer.

X& x = getx().ref(); // OK when will x die? - ve bu ne demek tam olarak ne olduğunu, çünkü umrumda değil, bilmiyorum "diline karşı". Dil söylüyor "geçici durumda başvuru kapsam dışına çıktığında ölürler sabit başvuru, bağlı oldukları sürece deyim sonunda ölür". Kural, x, görünen o ki uygulama zaten referans sabit bağlı olmadığı için sonraki deyimi başında öldü (derleyici ref ne olduğunu bilmiyor() işlevi). Ancak bu sadece bir tahmin.

2) amaç net olarak ifade etti: anlam (C 0 x rvalue başvuruları görmezden gelerek) yapmaz. çünkü geçici değiştirmek yasaktır Soru "neden olmayan sabit üye aramak yasak mı? ama ben zaten yukarıda. bir daha cevap yok" iyi biridir,

3) Eğer X& x = getx().ref(); x ifadesinin sonunda ölmek üzereyim ... eğer bu sorunlar ortada.

Neyse, soru ve yorumlarınızı dayanarak bile bu ekstra cevaplar seni tatmin edeceğini sanmıyorum. C Komitesi anlamda geçici değiştirmek için, bu nedenle yapmaz karar, olmayan sabit referanslar için bağlayıcı kabul etmedi. burada Özet/son bir girişimdir: Bazı derleyici olabilir uygulama ya da tarihi meseleleri de dahil edildi, bilmiyorum. Sonra, biraz özel bir durumda ortaya çıktı, ve her şeye rağmen hala olmayan sabit yöntemin çağrılması ile doğrudan değiştirilmesine izin vermezler karar verildi. Ama bu bir istisna olur - genellikle geçici değiştirmek için izin verilmez. Evet, C genellikle çok garip.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • lilstevie89

    lilstevie89

    25 Mart 2011
  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • SlimaksClass

    SlimaksClass

    15 Kasım 2010