2014-05-06 4 views
6

zdanie jest częścią ust §3.2/2:Co oznacza to zdanie w paragrafie §2.2/2 normy C++ 11?

Zmienna, której nazwisko pojawia się jako potencjalnie ocenić wyrażenie jest odr wykorzystane chyba jest to obiekt, który spełnia wymagania dla znajdującego się w stała ekspresja (5.19) i konwersja l-wartość-rna (4.1) jest natychmiast stosowana.

Co dokładnie oznacza zdanie pogrubione?

Edit:

Odpowiedź na pytanie, z czego ten jest uważany za duplikat, nie mówi niczego, co mogłoby odpowiedzieć na moje pytanie.

Odpowiedz

7

Oznacza to, że gdy używasz stałej jako stałej, to tak, jakbyś używał stałej.

struct S { 
    static const int i = 0; 
}; 
int main() { 
    return S::i; 
} 

Chociaż S::i ma initialiser, że nie ma definicji, ale tekst w swoim pytaniu sprawia specjalny wyjątek dla zastosowań takich jak ta, gdzie S::i jest dostępne tylko dla jego wartości. W takim przypadku definicja nie jest potrzebna.

Z drugiej strony, inne zastosowania wymagają definicji:

struct S { 
    static const int i = 0; 
}; 
int f(const int &i) { 
    return i; 
} 
int main() { 
    return f(S::i); 
} 

Ten program jest nieważne, i jest akceptowana przez niektórych implementacjach, ale odrzucona przez innych. Wywołanie f wymaga rzeczywistej definicji S::i, aby istnieć, ale jeśli zostanie wstawiony znak f, możliwe jest, że brak definicji nie zostanie zdiagnozowany.

W moim systemie, jeśli kompilacji i łączenia drugi program bez optymalizacji, otrzymuję:

 
$ g++ test2.cc -o test2 
/tmp/ccdEsfxs.o:test2.cc:function main: error: undefined reference to 'S::i' 
collect2: error: ld returned 1 exit status 

Aby to działało, definicja musi być zapewnione, tak:

struct S { 
    static const int i = 0; 
}; 
const int S::i; 
+0

Jak Czy powinieneś odnieść się do pierwszego przykładu: "konwersja wartości do rvalue jest natychmiast stosowana"? –

+1

Co masz na myśli przez "nie ma definicji"? – 0x499602D2

+0

@WakeupBrazil 'S :: i' jest lwartością, jest używane w instrukcji' return' w funkcji zwracającej 'int'. W takim przypadku wartość l musi być (i jest) przeliczona na wartość r. (Nie chodzi o to, że jest on używany w samym słowie 'return': w funkcji zwracającej' int & ', konwersja l-do-r-wartości nie byłaby zastosowana.) – hvd