Trong quá trình trả lời một câu hỏi khác, tôi tình cờ phát hiện ra những từ hơi khác nhau cho std::vector::erase()
và std::deque::erase()
.
Đây là những gì C ++ 14 nói về std::deque::erase
( [deque.modifiers]/4-6
, nhấn mạnh của tôi):
Hiệu ứng: ...
Độ phức tạp: Số lượng cuộc gọi đến hàm hủy giống như số phần tử bị xóa, nhưng Số lượng cuộc gọi đến toán tử gán không nhiều hơn số lượng phần tử Trước các phần tử bị xóa và số phần tử sau yếu tố bị xóa.
Ném: Không có gì trừ khi ngoại lệ được ném bởi hàm tạo sao chép, di chuyển hàm tạo, toán tử gán hoặc toán tử gán chuyển của
T
.
Và đây là những gì nó nói về std::vector::erase
( [vector.modifiers]/3-5
):
Hiệu ứng: ...
Phức tạp: Các destructor của
T
được gọi là số lần tương đương với số lượng các yếu tố xoá hoàn toàn, nhưng nhiệm vụ điều hành di chuyển củaT
được gọi là số lần tương đương với số phần tử trong vector sau khi các yếu tố bị xóa.Ném: Không có gì trừ khi ngoại lệ được ném bởi hàm tạo sao chép, di chuyển hàm tạo, toán tử gán hoặc toán tử gán chuyển của
T
.
Như bạn có thể thấy, các đặc tả ngoại lệ cho cả hai đều giống nhau, nhưng đối với std::vector
nó được đề cập rõ ràng rằng toán tử gán di chuyển được gọi.
Ngoài ra còn có yêu cầu về T
được MoveAssignable
cho erase()
làm việc với cả hai std::vector
và std::deque
(Bảng 100), nhưng điều này không có nghĩa sự hiện diện của các nhà điều hành phân công di chuyển: người ta có thể định nghĩa một toán tử gán sao chép, và không định nghĩa toán tử gán di chuyển, và lớp này sẽ được MoveAssignable
.
Chỉ trong trường hợp, tôi đã kiểm tra với GCC và Clang và thực sự std::vector::erase()
gọi toán tử gán gán sao chép nếu không có toán tử gán chuyển động và std::deque::erase()
thực hiện tương tự ( DEMO ).
Vì vậy, câu hỏi là: tôi đã bỏ lỡ một cái gì đó, hoặc đây là một vấn đề (biên tập) trong tiêu chuẩn?
Cập nhật: Tôi đã gửi một vấn đề về LWG # 2477 .