2013-06-11 25 views
9

Yerel nesneye başvuru getiren bir işlev yazdım.Yerel nesneye başvuru döndüren işlev

Fraction& operator*(Fraction& lhs, Fraction& rhs) 
{ 
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den); 
    return res; 
} 

fonksiyonu sonra res imha edilmesi ve alıcı bir amacı bunu kullanarak istenmeyen davranışlara yol Ex-Fraksiyon nesneye işaret eder nesnesi geri gönderecekti. Bu işlevi kullanacak kimse sorunla karşı karşıya gelecek.

Derleyici neden bu tür bir durumu derleme zamanı hatası olarak algılayamıyor?

+13

Genel olarak, - g ++, 'uyarı' gibi yerel bir değişkene 'x' döndürülür [varsayılan olarak etkinleştirildi] 'gibi bir şey basabilir. Kullandığınız derleyiciye ve/veya kullandığınız derleyici anahtarlarına bağlı olabilir. –

+2

, uyarıların ne zaman yapıldığı, tüm uyarıların hata olarak ele alınması zamanıdır. – yngccc

+0

Sabit referans ile geri dönebilirsiniz ve iyi olacak – dchhetri

cevap

19

Çoğu derleyici bunu yaptığınızda bir uyarı gösterecektir. Uyarıları her zaman GCC'nin -Wall gibi bir seçeneği ile açmalısınız.

Standart tarafından neden bir hata gerekmediği ile ilgili olarak, akış denetimine sahip bir işlev, dönüş değerinin yerel bir referans olup olmadığını anlamasını zorlaştırır. (Ve dönüş değeri yalnızca arayan tarafından kullanıldığında oluşur.)

+0

İşaretçi aritmetiği/yaratımı olmadan "söylemesi zor" durum için bir örnek verebilir misiniz? – Elazar

+8

@Elazar Sure, 'return fn (local_var);' İşlev, yerel değişken olan argümanına bir başvuru yapabilir. Veya 't & ref = bayrak? yerel: küresel; 've sonra geri dönüş ref; Daha sonra derleyici, fonksiyonun (istisna ile çıkmanın aksine) geri döndüğünü kanıtlamalıdır, sadece "flag" öğesi "false" ise. – Potatoswatter

+0

Derleyicinin koşullu ifadeye işaret eden 'return ref' için bir uyarı vermesi gerektiğini düşünüyorum. Bu bir "mayıs" analizidir. fn (yerel) 'i döndürmek farklı bir hikaye, katılıyorum. – Elazar

İlgili konular