2012-12-08 13 views
10

içinde a a const int& derlemek, ancak bir int& atama, bir derleme hatası verir.char için int başvuru ve const int başvurusu C++

char c; 
int& x = c; // this fails to compile 
const int& y = c; // this is ok 

ben bunu yapmak iyi bir uygulama olmadığını biliyoruz, ama bunun neden nedenini bilmek merak ediyorum.

"Farklı türden referans atama", "int referansa char atama" ve "const başvuru ve const olmayan başvuru arasındaki fark" konusunu arayarak bir yanıt aramış ve bir dizi yararlı mesajlar (int vs const int&, Weird behaviour when assigning a char to a int variable, Convert char to int in C and C++,), ancak sorumu ele almıyor gibi görünüyorlar.

Bu daha önce yanıtlanmışsa özür dilerim.

+0

@downvoter nedenini açıklar mısınız? Sorularımın kalitesini nasıl geliştirebileceğimi öğrenmek istiyorum, çünkü bu siteyi düzenli olarak ziyaret etmeyi planlıyorum. :) –

cevap

8
int& x = c; 

Burada int için char bir kapalı dönüştürme derleyici tarafından yapılmaktadır. Ortaya çıkan geçici int sadece bir const referansına bağlanabilir. Bir const int&'a bağlanması, geçici sonucun ömrünü de bağlı olduğu referansınkiyle eşleşecek şekilde genişletecektir.

+0

Güzel açıklama için teşekkürler. –

3

Bu davranış, bir ifade ile başlatıldı “CV1 T1” tip 8.5.3/p5.2 Kaynaklar [dcl.init.ref]

5 referans standart N4527 gerekçelendirmiştir tip arasında “cv2 T2” olarak aşağıdaki gibidir:

...

5.2

Aksi takdirde, referans bir uçucu olmayan const türü için bir lvalue referans olacaktır (diğer bir deyişle, CV1 const olacaktır), veya referansı, bir referans referans olacaktır. [Örnek:

double& rd2 = 2.0; // error: not an lvalue and reference not const 
int i = 2; 
double& rd3 = i; // error: type mismatch and reference not const 

- uç örneği]

1

hattı

const int& y = c; 

geçici oluşturur ve y geçici izleyerek kontrol edilebilir bağlanan olması:

#include <iostream> 

int main() 
{ 
    char c = 10; 
    const int& y = c; 

    std::cout << (int)c << std::endl; 
    std::cout << y << std::endl; 

    c = 20; 

    std::cout << (int)c << std::endl; 
    std::cout << y << std::endl; 

    return 0; 
} 

Çıkış:

10 
10 
20 
10 

c değeri ne zaman değiştirildiğine y değeri değişmedi.