Tại sao std :: span thiếu các toán tử so sánh?


10

Không phải là std::spanthiết kế như một tài liệu tham khảo nhẹ cho các vùng con của std::vector/ std::array/ mảng đơn giản và giống nhau sao? Không phải nó cũng chứa các toán tử so sánh trong API của nó, để phù hợp với chúng sao? Lý do đằng sau loại trừ là gì?

Lưu ý: bởi toán tử so sánh, tôi có nghĩa là một trong hai tập hợp đầy đủ ( <, <=, ...) hoặc các tàu vũ trụ<=>


IMO câu hỏi tuyệt vời, tôi tự hỏi tương tự. operator==cũng mất tích. Đặc biệt đối với vector tôi thường thấy thuận tiện để so sánh trực tiếp. Nó có thể là do khó khăn có lẽ với các loại nhịp kích thước tĩnh, mặc dù tôi không chắc chắn.
darune

Có vẻ như gsl :: span, từ đó std :: span được phiên bản từ không bao gồm cả hai.
darune

1
@DanielLangr tại sao không so sánh từ điển như thế nào std::vectorstd::arraylàm gì? Chúng được định nghĩa giống như vậy đối với các loại đó, vậy tại sao không ở đây.
Timo

2
Lưu ý rằng P0122R7 đề xuất so sánh cho span, nhưng tiêu chuẩn dự thảo hiện tại không bao gồm nó.
Daniel Langr

1
@darune gsl::span không (và luôn luôn làm) có các toán tử so sánh. Họ chỉ di chuyển chúng vào tiêu đề của riêng mình
Barry

Câu trả lời:


3

Như Daniel Langr đã chỉ ra , std::spancó các toán tử so sánh trong đề xuất ban đầu P0122 . Các toán tử này sau đó được gỡ bỏ kể từ dự thảo làm việc N4791 và các lý do được nêu trong P1085 .

Nói tóm lại, sao chép và const cho std::spanlà "nông" (nghĩa là sao chép std::spankhông sao chép các phần tử cơ bản của nó và const std::spankhông ngăn các phần tử bên dưới của nó bị sửa đổi), do đó, so sánh, nếu tồn tại, cũng nên "nông" cho thống nhất.

Bài viết đó đưa ra các ví dụ sau:

Ví dụ 1:

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

Ví dụ 2:

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

Các xác nhận trong các ví dụ này có thể thất bại nếu T = std::span, trong khi nó không dành cho các loại thông thường.

Người ta có thể lập luận rằng std::string_viewcó bản sao nông nhưng so sánh sâu sắc. P1085 cũng có một lời giải thích cho điều này:

string_viewTuy nhiên, điều này phù hợp với string_viewcác yếu tố mà nó chỉ ra, và do đó, bản sao nông string_viewcó thể được coi là tương tự như tối ưu hóa sao chép trên ghi.


Lưu ý rằng không có gì ngăn cản chủ sở hữu mảng ký tự sửa đổi bộ nhớ gốc trong khi std::string_viewtrỏ đến nó. Vì vậy, nói, std::map<std::span<T>, U>là như vỡ std::map<std::string_view, U>. IMHO, std::string_viewkhông nên chứa toán tử so sánh.
Lyberta
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.