2012-12-08 13 views
10

Zauważyłem, że przypisywanie kompilacji char do const int&, ale przypisanie jej do int& powoduje błąd kompilacji.przypisywanie znaku do odwołania do int i odwołania do wartości stałej w C++

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

Rozumiem, że nie jest to dobra praktyka, aby to zrobić, ale jestem ciekaw, dlaczego to się dzieje.

Szukałem odpowiedzi, szukając "przypisania do odwołania do innego typu", "przypisywania znaku do odwołania int" i "różnicy między odwołaniem do wartości stałej i odwołaniem do wartości stałych" i natrafiłem na pewną liczbę przydatne posty (int vs const int&, Weird behaviour when assigning a char to a int variable, Convert char to int in C and C++,), ale nie wydają się odpowiadać na moje pytanie.

Moje przeprosiny, jeśli wcześniej udzielono już odpowiedzi.

+0

@downvoter czy mógłbyś wyjaśnić powód? Chcę się dowiedzieć, jak poprawić tutaj jakość moich pytań, ponieważ planuję regularnie odwiedzać tę witrynę. :) –

Odpowiedz

8
int& x = c; 

Tutaj niejawna konwersja z char do int jest wykonywana przez kompilator. Wynikowy kod tymczasowy może być tylko powiązany z numerem referencyjnym const. Wiązanie z const int& wydłuży również okres ważności wyniku tymczasowego, aby dopasować go do odniesienia, do którego jest związany.

+0

Dzięki za miłe wyjaśnienie. –

3

Zachowanie to uzasadnione w standardowym N4527 w 8.5.3/P5.2 Literatura [dcl.init.ref]

5 odniesienie do CV1 typu „T1”, jest inicjowany przez wyrażenie typu „CV2 T2” w następujący sposób:

...

5,2 przeciwnym razie referencyjna wynosi lwartością odniesienie do nieulotnej typu const (tj CV1 będzie const) lub odniesienie będzie referencją rVue. [Przykład:

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 

- przykład end]

1

Fakt, że linia

const int& y = c; 

tworzy chwilowy i y wiąże się tymczasowy może zostać zweryfikowany brzmienie:

#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; 
} 

Moc wyjściowa:

10 
10 
20 
10 

Wartość y nie uległa zmianie, gdy wartość c została zmieniona.

Powiązane problemy