int main() {
const int x = 0;
int* y = x; // line 3
int* z = x+x; // line 4
}
rzekła standardu (C++ 11 §4.10/1)Inicjalizacja za pomocą zerowej stałej wskaźnika: które zachowanie jest poprawne?
NULL stałe jest integralną wyrażenie stałe (5,19) prvalue typu liczby całkowitej, która ma wartość zero lub prvalue typu
std::nullptr_t
. Stała wskaźnika pustego może zostać przekonwertowana na typ wskaźnika; ...
Istnieją cztery możliwości:
Linia 4 jest OK, ale nie jest to linia 3. Wynika to z faktu, że
x
ix+x
są zarówno wyrażeniami stałymi, które oceniają 0, ale tylkox+x
jest prwartością. Wygląda na to, że gcc przyjmuje tę interpretację (live demo)Linie 3 i 4 są prawidłowe. Chociaż
x
jest wartością l, to stosowana jest konwersja l-wartość-rna, co daje stałą wartość wyrażenia równą 0. Klang w moim systemie (klang-3.0) przyjmuje obie linie 3 i 4.Linie 3 i 4 nie są w porządku. clang-3.4 błędy na obu liniach (live demo).
Linia 3 jest OK, ale linia 4 nie jest. (Zawarte w celu zapewnienia kompletności, nawet jeśli żaden kompilator, którego próbowałem, nie wykazuje takiego zachowania.)
Kto ma rację? Czy to zależy od wersji standardu, którą rozważamy?
Poza pytaniem "Kto ma rację" w odniesieniu do (3) lub (4), prawdopodobnie równie istotne jest pytanie, kto tak naprawdę zrobiłby * albo * i * dlaczego *? – WhozCraig