Có an toàn khi gán một container bằng cách sử dụng các trình vòng lặp của chính nó không?


10

Ví dụ:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

Là hành vi của mã trên được xác định? Hoặc nó dẫn đến hành vi không xác định?

Câu trả lời:


5

Đúng. Phiên bản gán này được định nghĩa

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

Các ràng buộc : InputIterator là một loại đủ điều kiện là một trình vòng lặp đầu vào.

Hiệu ứng : Tương đương với: return gán (basic_ chuỗi (đầu tiên, cuối cùng, get_allocator ()));

trong đó cho thấy một tính toán tạm thời trước khi thay đổi diễn ra.


"tương đương" không có nghĩa là tạm thời phải được tạo. Các ngữ nghĩa phải giống nhau, mặc dù. Và vì phiên bản hiển thị là an toàn đối với tự gán, nên việc thực hiện thực tế cũng phải như vậy.
MSalters

@MSalters. đã đồng ý. Tôi dự định bình luận về điều đó sau đó bị lạc khi cố gắng xác định mức độ sử dụng của người cấp phát có thể bị xóa bỏ.
AProgrammer

Lưu ý rằng điều này là cụ thể cho chuỗi. Đối với, vectơ, nó sẽ là UB.
TC

@TC, bạn có thể trích dẫn tiêu chuẩn?
Adler

1
@Adler, xem bảng này mà mô tả vector đề cập đến.
AProgrammer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.