2015-03-14 13 views
7

Các câu lệnh đó có hợp lệ theo tiêu chuẩn không?Giảm trình bắt đầu() và sau đó tăng lại lần nữa

std::string str{"123"}; 
auto it = str.begin(); 
--it; 
++it; // Does *it point to character '1' now? 

Tôi đã thử này trên g ++ 4.7.2 và kêu vang ++ 3,5-*it lợi nhuận '1'. Đây có phải là hành vi tiêu chuẩn trong C++ 11 không?

+2

Thử kiểm tra gỡ lỗi: http://coliru.stacked-crooked.com/a/3c72499373b8d2fb – dyp

Trả lời

13

Không, nó không hợp lệ.

Đó là hành vi không xác định, vì 24.2.6 [hai chiều.iterators] cho biết rằng một điều kiện của --it là kết quả phải được bỏ qua. Vì nó trỏ trước begin() trong ví dụ của bạn, điều kiện này không được đáp ứng và do đó mã này là bất hợp pháp.

Vì không yêu cầu chẩn đoán, có thể dường như hoạt động, nhưng bạn không thể (và không nên) dựa vào nó.

+0

Chẳng phải lý do sẽ là cách khác? Điều kiện * pre * không được đáp ứng vì không có 's' trước' r = begin() 'sao cho' r == ++ s'. Do đó, hoạt động không được phép. – 5gon12eder

+0

@ 5gon12eder Có nhiều cách để xem xét và giải thích về nó. Tôi đã sử dụng postcondition như nó có vẻ rõ ràng nhất với tôi, cùng với ý nghĩ rằng nếu bạn giảm một iterator, nó vẫn phải trỏ đến một vị trí hợp lệ. YMMV. –

+0

@ 5gon12eder: một trong hai lý do đặt biểu thức trong hành vi không xác định. Cũng lưu ý rằng ngay cả đối với các con trỏ thô, hành vi của '--' là không xác định nếu con trỏ bắt đầu chỉ ra phần tử đầu tiên của mảng hoặc đối tượng không phải là phần tử của mảng. –

Các vấn đề liên quan