2014-06-14 5 views
6
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:

  1. Linia 4 jest OK, ale nie jest to linia 3. Wynika to z faktu, że x i x+x są zarówno wyrażeniami stałymi, które oceniają 0, ale tylko x+x jest prwartością. Wygląda na to, że gcc przyjmuje tę interpretację (live demo)

  2. 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.

  3. Linie 3 i 4 nie są w porządku. clang-3.4 błędy na obu liniach (live demo).

  4. 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?

+3

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

Odpowiedz

10

Sformułowanie w standardzie zmienione w wyniku DR 903. Nowe sformułowanie

null stały wskaźnik jest całkowitą dosłownym (2.14.2) o wartości zerowej lub prvalue typu std::nullptr_t.

Issue 903 wiąże się ciekawy przypadek rogu, gdzie nie da się wyprodukować „prawidłowy” rozdzielczość przeciążenie w niektórych przypadkach, gdy parametr jest szablon (ewentualnie 0) całkowita stała.

Widocznie liczba możliwych rozdzielczościach zostały rozpatrzone, ale

Był silny konsensus wśród działań grupy roboczej, która tylko dosłowne 0 należy uznać za zerowy wskaźnik stała, nie każdy arbitralne wartości zerowej stałej ekspresji jako jest obecnie określony.

Tak, to zależy od tego, czy kompilator wdrożył rozdzielczość do DR 903, czy nie.