Size: a a a

2020 August 05

ГH

Гласси Hudobin in pro.cxx
если будет const std::string_view ret = str; то код ок.
источник

m

magras in pro.cxx
magras
Это вполне явное преобразование.
Я не прав:
constexpr operator std::basic_string_view<CharT, Traits>() const noexcept;
источник

АК

Александр Караев... in pro.cxx
Гласси Hudobin
Там же константности нет.
где??
string_view - это почти span<const char>, есть у него константность
источник

АК

Александр Караев... in pro.cxx
Гласси Hudobin
если будет const std::string_view ret = str; то код ок.
это полная чушь
источник

VD

Vlad Doc in pro.cxx
Гласси Hudobin
если будет const std::string_view ret = str; то код ок.
>const string_view
источник

АК

Александр Караев... in pro.cxx
Гласси Hudobin
если будет const std::string_view ret = str; то код ок.
как вообще константность переменной связана с тем, создаётся ли временное значение справа?

нет,
std::string_view ret = str;
не эквивалентно
std::string_view ret = std::string(str);
источник

m

magras in pro.cxx
Гласси Hudobin
Там же константности нет.
Через string_view нельзя модифицировать строку. Поэтому нет проблемы в том, что сам string_view не константый.
источник

АК

Александр Караев... in pro.cxx
у меня есть лишь одно предположение - @khudobin решил, что std::string_view - вьюха на мутабельный буфер (это не так), соответственно создаётся копия строки в правой части.
однако, даже если бы это было так, то const на переменную ничего бы не исправил
источник

ГH

Гласси Hudobin in pro.cxx
Так. А что можно передать в функцию, что потом неявно к строке должно преобразоваться?
источник

АК

Александр Караев... in pro.cxx
ну вот такой код
auto a = myfunc("123");
уже приведёт к висячей ссылке
источник

АК

Александр Караев... in pro.cxx
впрочем, если человек видит функцию с семантикой (view) -> view, он должен отдавать себе отчёт, что время жизни результата не должно превышать времени жизни аргумента
источник

АК

Александр Караев... in pro.cxx
Александр Караев
ну вот такой код
auto a = myfunc("123");
уже приведёт к висячей ссылке
при этом, если бы myfunc принимала вьюху, а не const string&, то всё было бы ок (аргумент - литерал, поэтому результат будет жить вечно)
источник

ГH

Гласси Hudobin in pro.cxx
Или в том примере substr() было...
источник

m

magras in pro.cxx
Сигнатура myfunc выглядит очень подозрительно. Я не могу придумать по какой причине я бы использовал одновременно const string& и string_view.
источник

ГH

Гласси Hudobin in pro.cxx
{ std::string_view ret = str.substr(1); return ret; } // здесь же будет висячая ссылка?
источник

АК

Александр Караев... in pro.cxx
Гласси Hudobin
Или в том примере substr() было...
С substr всё сломалось бы. Но для этого и функция не нужна:
string_view a = string("123").substr(1);
или проще, что уж:
string_view a = string("123");

Это все висячие ссылки
источник

ГH

Гласси Hudobin in pro.cxx
ну с точки зрения здравого смысла substr от неизменяемой строки как раз должен быть вьюхой.
источник

ГH

Гласси Hudobin in pro.cxx
а он нет, он временный объект
источник

m

magras in pro.cxx
Гласси Hudobin
ну с точки зрения здравого смысла substr от неизменяемой строки как раз должен быть вьюхой.
Так это проблема string, а не view.
источник

m

magras in pro.cxx
Если работать с view, то получишь view и код будет корректным.
источник