Почему нет поддержки конкатенации std::string и std::string_view?

Начиная с C++17, у нас есть std::string_view, облегченное представление в непрерывная последовательность символов, позволяющая избежать ненужного копирования данных. Вместо параметра const std::string& теперь часто рекомендуется использовать std::string_view.

Однако быстро выясняется, что переключение с const std::string& на std::string_view ломает код, использующий конкатенацию строк, поскольку конкатенация std::string и std::string_view не поддерживается:

std::string{"abc"} + std::string_view{"def"}; // ill-formed (fails to compile)
std::string_view{"abc"} + std::string{"def"}; // ill-formed (fails to compile)

Почему в стандарте нет поддержки объединения std::string и std::string_view?


person s3rvac    schedule 19.06.2017    source источник
comment
Скорее всего оплошность. Тем не менее, не требуется много времени, чтобы добавить operator +, чтобы код заработал.   -  person NathanOliver    schedule 19.06.2017
comment
Только что нашел это: groups.google.com/ a/isocpp.org/forum/#!topic/std-proposals/   -  person NathanOliver    schedule 19.06.2017
comment
Чего мне также не хватает, так это функции-члена std::basic_string, которая возвращает std::basic_string_view подстроки (аналогично функции-члену substr), возможно, с именем substr_view.   -  person CAF    schedule 19.06.2017
comment
Посмотри на это. github.com/OlafvdSpek/xbt/blob/master/misc/ xbt/string_view.h   -  person asad_nitp    schedule 27.09.2017


Ответы (1)


Причина этого указана в n3512 string_ref: невладеющая ссылка на строку, редакция 2 Джеффри Яскина:

Я также пропустил оператор+(basic_string, basic_string_ref), потому что LLVM возвращает облегченный объект из этой перегрузки и только лениво выполняет конкатенацию. Если мы определим эту перегрузку, позже нам будет трудно ввести эту облегченную конкатенацию.

Позже это было предложено на std-proposals список рассылки, чтобы добавить эти перегруженные операторы в стандарт.

person vitaut    schedule 10.12.2017
comment
Ух ты. Просто вау! Кажется, это наихудшая возможная причина для того, чтобы что-то упустить. Предполагается, что стандарт предназначен для блага языка, а не для какой-либо конкретной реализации. Я также настороженно отношусь к ленивому выполнению конкатенации - означает ли это, что в случае нехватки памяти исключение для добавления к исходной строке также будет отложено? Я чертовски надеюсь, что нет, я хочу знать, если операция завершится ошибкой, когда я ее выполню, а не через десять минут, когда я получу результат. - person paxdiablo; 10.12.2017
comment
Надеюсь, кто-то представит предложение о включении этих операторов. - person vitaut; 10.12.2017
comment
В библиотеке fmtlib/fmt прекрасно работает с string_view. - person void.pointer; 19.08.2019
comment
std::basic_string::append() имеет перегрузку, которая принимает все, что может быть неявно преобразовано в std::string_view. Конечно, это не то же самое, что operator+(). - person Brandlingo; 09.12.2019
comment
Какие альтернативы предлагают здесь комментаторы, если нужна эффективная конкатенация строк С++ (т.е. построитель строк)? Например, библиотеки C# имеют эффективный класс uri_builder, который берет группу строк и создает ее с помощью метода to_string(); что на самом деле могло бы быть реализовано, если бы string_view имел перегрузку +(). - person b.g.; 01.07.2020
comment
my_s.insert(0, my_sv); // s = sv + s my_s.append(my_sv); // с = с + св - person vSzemkel; 31.12.2020