Співробітник хотів написати це:
std::string_view strip_whitespace(std::string_view sv);
std::string line = "hello ";
line = strip_whitespace(line);
Я сказав, що повернення string_view
зробило мене неспокійно апріорі , і, крім того, псевдонім тут для мене був схожим на UB.
Я можу з упевненістю сказати, що line = strip_whitespace(line)
в даному випадку рівнозначно line = std::string_view(line.data(), 5)
. Я вважаю, що виклик string::operator=(const T&) [with T=string_view]
, який визначається як еквівалентний line.assign(const T&) [with T=string_view]
, який визначений як еквівалентний line.assign(line.data(), 5)
, який визначено для цього:
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.
Але це не говорить про те, що відбувається, коли відбувається згладжування.
Я поставив це запитання на cpplang Slack вчора і отримав неоднозначні відповіді. Тут шукають супер авторитетні відповіді та / або емпіричний аналіз реальної реалізації бібліотечних постачальників.
Я написав тестові випадки для string::assign
, vector::assign
, deque::assign
, list::assign
, і forward_list::assign
.
- Libc ++ змушує усі ці тестові справи працювати.
- Libstdc ++ змушує їх працювати, за винятком тих
forward_list
, які переходять на сегменти . - Я не знаю про бібліотеку MSVC.
Segfault в libstdc ++ дає мені надію, що це UB; але я також бачу, що і libc ++, і libstdc ++ докладають великих зусиль, щоб зробити цю роботу хоча б у звичайних випадках.
*this
. Але я не бачу нічого, що б перешкоджало повторному використанню наявного сховища, і в цьому випадку це стає не визначеним, оскільки семантика копіювання над сховищем не визначена.
assign
вимог у [tab: container.seq.req] .