2015-03-14 11 views

Odpowiedz

13

Nie, jest nieważny.

Jest to niezdefiniowane zachowanie, ponieważ 24.2.6 [dwukierunkowe.iteratory] stwierdza, że ​​warunkiem końcowym --it jest, że wynik musi być dereferencyjny. Jak wskazuje na to w swoim przykładzie przed begin(), ten warunek nie jest spełniony, a zatem kod jest nielegalny.

Ponieważ diagnostyka nie jest wymagana, może zadziałać, ale nie można (i nie należy) polegać na nim.

+0

Czy rozumowanie nie powinno być odwrotnie? Warunek * pre * nie jest spełniony, ponieważ nie ma 's' przed' r = begin() 'takim, że' r == ++ s'. Dlatego operacja nie jest dozwolona. – 5gon12eder

+0

@ 5gon12eder Istnieje wiele sposobów, aby na to patrzeć i rozumować. Użyłem warunku, ponieważ wydaje mi się to najbardziej oczywiste, myśląc, że jeśli zmniejszysz iterator, to musi on wskazywać prawidłową lokalizację. YMMV. –

+0

@ 5gon12eder: jeden z powodów umieszcza wyrażenie w niezdefiniowanym zachowaniu. Zauważ, że nawet dla surowych wskaźników zachowanie '-" jest niezdefiniowane, jeśli wskaźnik zaczyna się od wskazania pierwszego elementu tablicy lub obiektu, który nie jest elementem tablicy. –

Powiązane problemy