Экспериментальное :: basic_string_view & lt; & gt; работать со значениями?

Я не на 100% уверен, что следующий код семантически правильный:

#include <iostream>
#include <experimental/string_view>

int main()
{
std::string str = "lvalue string";

std::experimental::string_view view_lvalue(str);
std::experimental::string_view view_rvalue(std::string{"rvalue string"});

std::cout << view_lvalue << '\n' << view_rvalue << '\n';
}

Жить на Wandbox

Вопрос: Могу ли я юридически связать станд :: экспериментальный :: basic_string_view, или это просто UB? Если да, то как это работает? Насколько я знаю, значение не привязывается к const ссылка (которую я предполагаю, что представление содержит исходную строку) через конструктор, поэтому я подумал, что в конце оператора std::experimental::string_view view_rvalue(std::string{"rvalue string"}); ссылка будет болтаться. Есть ли string_view использовать более сложный подход?

Я спрашиваю об этом, потому что я пытаюсь написать аналогичное представление для некоторого матричного класса, и пока не знаю, как обращаться с rvalues ​​(конечно, я могу их отключить, но я не думаю, что это лучший подход).

3

Решение

Если cpprefernce правильно, то это UB. std::string_view имеет

Типичная реализация содержит только два члена: указатель на константу CharT и size,

И конструктор имеет

Строит вид первого str.size() символы массива символов, начиная с элемента, указанного str.data(),

Так что если string_view просто указывает на базовый массив char предоставленной строки, тогда у нас будет висячий указатель, как только выражение закончится и временное уничтожится.

Как указано в комментариях, одна из причин, по которой такое поведение разрешено, заключается в том, что вы можете передать string_view к функции и построить это string_view из временного string

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]