Sao chép / di chuyển gán trong std :: vector :: erase () và std :: deque :: erase ()


135

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()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ủa Tđượ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::vectornó đượ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 MoveAssignablecho erase()làm việc với cả hai std::vectorstd::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 .


14
Có vẻ như một khiếm khuyết trong tiêu chuẩn.
Barry

4
^ ack. Một vấn đề LWG sẽ là phù hợp.
Columbo

4
Thông thường tiêu chuẩn dự thảo là đủ tốt. Đây là một trong những trường hợp mà bạn nên nhìn vào thực tế.
Đánh dấu tiền chuộc

3
@MarkRansom nguồn hiện tại của tiêu chuẩn cho std :: dequestd :: vector giống như trong câu hỏi, vì vậy xác suất phiên bản cuối cùng khác nhau là rất ít.
Anton Savin

3
N4141 có cùng từ ngữ với N4140.
Brian

Câu trả lời:


9

Tại cuộc họp Lenexa, vấn đề có tình trạng ngay lập tức với giải pháp được đề xuất:

Từ ngữ này có liên quan đến N4296.

Thay đổi 23.3.3.4 [deque.modifier] / 5 thành:

-5- phức tạp : Số cuộc gọi đến các destructor củaT cũng giống như số phần tử bị xóa, nhưng số lượng các cuộc gọi đến toán tử gán củaT không ít hơn so với số lượng các yếu tố trước khi các yếu tố xoá hoàn toàn và số phần tử sau khi phần tử bị xóa.

Thay đổi 23.3.6.5 [vector.modifier] / 4 thành:

-4- Độ phức tạp : Hàm hủy của Tđược gọi là số lần bằng với số phần tử bị xóa, nhưng toán tử gán chuyển độngT được gọi là số lần bằng số phần tử trong vectơ sau phần tử bị xóa.

Đó là, nếu độ phân giải được chấp nhận, sẽ không có đề cập đặc biệt nào về việc chuyển nhượng cho std::vector::erasevà từ ngữ std::deque::erasecũng sẽ được làm rõ một chút.

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.