2016-09-22 56 views
6

Jestem zdezorientowany z tymi dwoma. Jestem świadomy referencji C++, które są z natury stałe i po ustawieniu nie można ich zmienić, aby odnosić się do czegoś innego.Jaka jest różnica między "const int & jj" i "int & const jj"?

+3

Czy Twój kompilator zaakceptować 2nd wariant? – juanchopanza

+1

Proszę określić, który kompilator zaakceptował dla ciebie drugi wariant. – Angew

+3

@HumamHelfawi To wcale nie jest duplikat. To pytanie dotyczy "const int" i "int const", obydwu poprawnych (i równoważnych) formularzy. Ten zajmuje się 'const int &' i błędem składni 'int & const'. – Angew

Odpowiedz

9

const int& oznacza odniesienie do stałej int. (Podobnie int& oznacza odniesienie do const int).

int& const dosłownie const odniesienia (na const int), który jest nieważny C++, bo sam w sobie odniesienia nie może być kwalifikowana const.

$8.3.2/1 References [dcl.ref]

Cv wykwalifikowanych odniesienia są odpowiednio uformowane z wyjątkiem gdy CV kwalifikatory są wprowadzane przez zastosowanie typedef nazwy ([dcl.typedef] [temp.param]) lub specyfikator decltype ([dcl.type.simple]), w którym to przypadku kwalifikatory cv są ignorowane.

Jak już wspomniano, odniesienia są z natury stałe i po ich ustawieniu nie można ich zmienić, aby odnosić się do czegoś innego. (Nie możemy ponownie powiązać referencji po jej inicjalizacji.) Oznacza to, że referencja jest zawsze "const", wtedy referencja const-qualified lub odwołanie bez wartości stałej może w rzeczywistości nie mieć sensu.

3

const Kwalifikator zastosowany do odniesienia oznacza, że ​​nie można zmienić wartości odniesienia. Na przykład:

void foo(int& arg) { 
    arg = 1; // OK. The value passed by a caller will be changed in-place. 
} 

void foo(const int& arg) { 
    arg = 1; // Compilation error. 
} 

int& const jj to błąd kompilacji.

3

Różnica:

const int& jj// means a reference to const int. 

int& const jj // ill formed code that should trigger a compiler error