2016-08-29 29 views
16

Câu hỏi của tôi là về C++ 17: http://en.cppreference.com/w/cpp/string/basic_string_view/basic_string_viewKhông chuyển đổi ngầm từ std :: string để std :: string_view trong C++ 17 (đã ở std :: nghiệm :: basic_string_view)

gì là caveat của chuyển đổi tiềm ẩn từ std :: basic_string để std :: basic_string_view rằng nó không được bao gồm trong giao diện của sau này?

Tôi tin rằng nó sẽ cải thiện đáng kể lớp học này. Đặc biệt là họ của toán tử so sánh, cũng không chấp nhận std :: string là không lhs cũng không phải rhs.

Có chuyển đổi như vậy trong thư viện cơ bản TS đặc điểm kỹ thuật: http://en.cppreference.com/w/cpp/experimental/basic_string_view/basic_string_view

Câu hỏi này là về việc tại sao nó đã được gỡ bỏ. Hay đúng hơn là không được chấp nhận.

+0

Chuyển đổi C++ 17 theo hướng ngược lại, từ string_vew thành chuỗi. – Cubbi

+0

@Cubbi Đối với một, chuyển đổi đó là * rõ ràng *. Thứ hai, chuyển đổi thành 'std :: string' sẽ là một cách khá đắt tiền để so sánh' std :: string_view' với 'std :: string'. – GreenScape

+8

Nó đã được quyết định rằng đây sẽ là trách nhiệm 'basic_string'. http://en.cppreference.com/w/cpp/string/basic_string/operator_basic_string_view –

Trả lời

15

basic_string_view được coi là lớp cấp thấp hơn. Đó là nhà cung cấp các vùng chứa chuỗi có trách nhiệm cung cấp các chuyển đổi tiềm ẩn cho string_view. Nếu bạn có loại chuỗi của riêng mình, thì bạn có thể cho nó có thể là quá tải có thể explicitoperator string_view() để thực hiện chuyển đổi ngầm định.

Như vậy, it was decided (PDF) rằng basic_string sẽ cung cấp chuyển đổi thành basic_string_view. Phiên bản Nguyên tắc cơ bản về Thư viện ban đầu đặt chuyển đổi ngầm trên basic_string_view, bởi vì TS thường là phần mở rộng. Nó không thể ảnh hưởng đến một loại hiện có mà không cần loại bỏ hiệu quả loại đó.

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