auto a = new int[0];
Zgodnie z [basic.compound.3] przechowywana wartość amusi być jedną z następujących czynności:
- Wskaźnik do obiektu (typu
int)
- Wskaźnik za końcem obiektu
- Zero
- Nieważny
Możemy wykluczyć pierwszą możliwość, ponieważ nie zbudowano żadnych obiektów typu int. Trzecia możliwość jest wykluczona, ponieważ C ++ wymaga zwrotu niepustego wskaźnika (patrz [basic.stc.dynamic.allocation.2] ). Mamy zatem dwie możliwości: wskaźnik za końcem obiektu lub nieprawidłowy wskaźnik.
Byłbym skłonny postrzegać ajako wskaźnik przeszłości, ale nie mam renomowanego odniesienia, aby definitywnie to ustalić. (Istnieje jednak silna implikacja tego w [basic.stc] , widząc, jak można deleteten wskaźnik.) W związku z tym przedstawię obie możliwości.
Czy między inicjowaniem i usuwaniem kopii można odczytywać wskaźnik w a + 1?
Zachowanie jest niezdefiniowane, jak podyktowane jest to [expr.add.4] , niezależnie od tego, która z powyższych możliwości ma zastosowanie.
Jeśli awskaźnik jest końcowy, uważa się, że wskazuje hipotetyczny element na indeks 0tablicy bez elementów. Dodanie liczby całkowitej jdo ajest definiowane tylko wtedy 0≤0+j≤n, gdy , gdzie njest rozmiar tablicy. W naszym przypadku nwynosi zero, więc suma a+jjest definiowana tylko wtedy, gdy jjest 0. W szczególności dodawanie 1jest niezdefiniowane.
Jeśli ajest nieważny, wówczas czysto popadamy w „W przeciwnym razie zachowanie jest niezdefiniowane”. (Nic dziwnego, że zdefiniowane przypadki obejmują tylko prawidłowe wartości wskaźnika).
Ponadto, nie pozwalają na język kompilator zestaw ado nullptr?
Nie. Z wyżej wspomnianego [basic.stc.dynamic.allocation.2] : „Jeśli żądanie powiedzie się, wartość zwrócona przez wymienną funkcję alokacji jest wartością wskaźnika o wartości innej niż zero” . Istnieje również przypis wzywający, że C ++ (ale nie C) wymaga niepustego wskaźnika w odpowiedzi na żądanie zerowe.
ana pewno czytać (z pewnością nie możesz tego wyrejestrować).