C++ średnia [s 5,7] mówi:Czy wskaźnik "jeden od końca-końca" typu bez tablicy jest poprawną koncepcją w C++?
Jeśli zarówno operand wskaźnik i punkt wynik do elementów tego samego obiektu tablicy lub jeden obok ostatni element obiektu tablicy, ocena nie powinna wytworzyć przepełnienie; w przeciwnym razie zachowanie jest nieokreślone.
Czy mam rację, zakładając, że wskaźniki typu "przeszłość końca" innych typów niż tablice są niezdefiniowane?
Na przykład:
int a = 0;
vector<int> v(&a, (&a)+1);
Powyższy fragment kompiluje i działa dobrze (z g ++), ale czy to ważne?
Chciałbym wypowiedzieć się na temat tego, czy 'wskaźniki jednego-końca-końca-typu innych niż tablice są niezdefiniowane?'. ** Wskaźniki ** są zawsze zdefiniowane, ponieważ są po prostu liczbami, adresami. Wartość ** ** dla tego wskaźnika jest jednak niezdefiniowana. Nie wolno ci wyłączać tych wskazówek. Ale konstruktor 'vector' nie usuwa ich, więc jest w porządku. – NIA
Prawda, ale przestrzeń adresowa nie jest nieskończona. Tak więc istnieje wskaźnik do ostatniego elementu w przestrzeni adresowej. Zwiększanie tego wskaźnika nie ma sensu. –
Wskaźniki nie są po prostu liczbami. Standard C++ wyraźnie pokazuje, że nie można używać arbitralnego dodawania i odejmowania za pomocą wskaźników. W szczególności praktyka używania wskaźnika do jednego przed tablicą w celu dostosowania do algorytmów opartych na 1 powoduje niezdefiniowane zachowanie. AFAIK są lub były architekturami komputerowymi, gdzie ładowanie wartości, która nie wskazuje prawidłowej pamięci do rejestru wskaźnika, może spowodować pułapkę. – JoergB