2011-09-13 10 views
8

Poniżej znajduje się, czy istnieje obiekt tymczasowy utworzony przed odniesieniem do const dla obiektu niestałego?const odniesienie do obiektu nie będącego stałym obiektem

const int y = 2000; 
const int &s = y // ok, const reference to const object. 

int x = 1000; 
const int &r = x; // any temporary copy here? 

Jeśli nie, to jak to działa?

const int z = 3000; 
    int &t = z // ok, why can't you do this? 

Odpowiedz

13

nr

Odniesienie jest po prostu alias dla istniejących obiektów. const jest egzekwowane przez kompilator; po prostu sprawdza, czy nie próbujesz modyfikować obiektu przez odniesienie r. * Nie wymaga to tworzenia kopii.

Biorąc pod uwagę, że const jest jedynie instrukcją do kompilatora, aby wymusić "tylko do odczytu", to powinno być od razu oczywiste, dlaczego twój ostatni przykład nie kompiluje. const byłoby bezcelowe, gdyby można było go obejść, biorąc inny obiekt niż const do obiektu const.

* Oczywiście nadal można modyfikować obiekt za pomocą x. Wszelkie zmiany będą również widoczne za pośrednictwem r, ponieważ odnoszą się do tego samego obiektu.

+1

W szczególności, wartość 'r' można zmienić, mimo że jest zadeklarowana "const". – avakar

+0

Zwykle kompilatory implementują odniesienie za pomocą prostego wskaźnika. –

+1

@quant_dev Biorąc pod uwagę próbkę OP, kod źródłowy, który wymienia 'x' i kod źródłowy, który wymienia' r', są kompilowane do identycznego kodu maszynowego. Nie ma żadnych wskaźników (na wszystkich kompilatorach, które widziałem). Nie tak ważne. – Cubbi

5

W

int x = 1000; 
const int &r = x; 

po stronie prawej stronie jest lwartość i typ x jest taki sam, jak odniesienia (pomijając CV zastrzeżeniami). W tych okolicznościach odnośnik jest dołączony bezpośrednio do x, nie utworzono tymczasowego.

Co do "jak to działa" ... Nie rozumiem, co skłoniło pana do postawienia pytania. Działa tylko w najbardziej przejrzysty sposób: odnośnik jest dołączony bezpośrednio do x. Nic więcej.

Nie można zrobić

const int z = 3000; 
int &t = z; 

ponieważ bezpośrednio narusza zasady const-poprawności.

+2

+1 za odpowiedź na obie części – Lou

1

Zrozumienie na Reference (&) odpowiada na to pytanie ..

referencyjny jest tylko aliasem do zmiennej, która jest przypisana do niego ..

I const jest ograniczenie narzucone przez kompilator do zmiennej zadeklarowanej jako const

int x = 1000; 
const int &r = x; 

W tym przypadku jest to odwołanie do zmiennej stałej. Więc nie można zmienić dane x ze zmienną referencyjną R (tak działa tylko do odczytu) .. ale nadal można zmienić dane X modyfikując X

const int z = 3000; 
int &t = z 

W tym przypadku, dla odniesienia const do const członka, który jest bez znaczenia. Mówisz, że referencja może pozwolić ci na edycję elementu const (co nigdy nie jest możliwe).

Więc jeśli chcesz utworzyć odniesienie do const członka, musi być jak w pierwszym przypadku, o którym mowa

const int z = 3000; 
const int &t = z; 
Powiązane problemy