Một đồng nghiệp muốn viết điều này:
std::string_view strip_whitespace(std::string_view sv);
std::string line = "hello ";
line = strip_whitespace(line);
Tôi cho rằng việc trở về string_view
khiến tôi không thoải mái một tiên nghiệm , và hơn nữa, các răng cưa ở đây trông giống như UB đối với tôi.
Tôi có thể nói chắc chắn rằng line = strip_whitespace(line)
trong trường hợp này là tương đương với line = std::string_view(line.data(), 5)
. Tôi tin rằng sẽ gọi string::operator=(const T&) [with T=string_view]
, được xác định là tương đương line.assign(const T&) [with T=string_view]
, được xác định là tương đương với line.assign(line.data(), 5)
, được xác định để làm điều này:
Preconditions: [s, s + n) is a valid range.
Effects: Replaces the string controlled by *this with a copy of the range [s, s + n).
Returns: *this.
Nhưng điều này không nói điều gì xảy ra khi có răng cưa.
Tôi đã hỏi câu hỏi này trên cpplang Slack ngày hôm qua và nhận được câu trả lời hỗn hợp. Tìm kiếm câu trả lời siêu có thẩm quyền ở đây và / hoặc phân tích thực nghiệm về việc triển khai của các nhà cung cấp thư viện thực sự.
Tôi đã viết trường hợp thử nghiệm cho string::assign
, vector::assign
, deque::assign
, list::assign
, và forward_list::assign
.
- Libc ++ làm cho tất cả các trường hợp thử nghiệm này hoạt động.
- Libstdc ++ làm cho tất cả chúng hoạt động ngoại trừ
forward_list
, đó là segfaults. - Tôi không biết về thư viện của MSVC.
Segfault trong libstdc ++ cho tôi hy vọng rằng đây là UB; nhưng tôi cũng thấy cả libc ++ và libstdc ++ sẽ nỗ lực rất nhiều để làm cho công việc này ít nhất là trong các trường hợp phổ biến.
*this
. Nhưng tôi thấy không có gì để ngăn chặn việc lưu trữ hiện tại được sử dụng lại, trong trường hợp này, điều này trở nên không xác định, vì ngữ nghĩa của việc sao chép lưu trữ là không xác định.
assign
yêu cầu trong [tab: container.seq.req] .