Я не на 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';
}
Вопрос: Могу ли я юридически связать станд :: экспериментальный :: basic_string_view, или это просто UB? Если да, то как это работает? Насколько я знаю, значение не привязывается к const
ссылка (которую я предполагаю, что представление содержит исходную строку) через конструктор, поэтому я подумал, что в конце оператора std::experimental::string_view view_rvalue(std::string{"rvalue string"});
ссылка будет болтаться. Есть ли string_view
использовать более сложный подход?
Я спрашиваю об этом, потому что я пытаюсь написать аналогичное представление для некоторого матричного класса, и пока не знаю, как обращаться с rvalues (конечно, я могу их отключить, но я не думаю, что это лучший подход).
Если cpprefernce правильно, то это UB. std::string_view
имеет
Типичная реализация содержит только два члена: указатель на константу
CharT
иsize
,
И конструктор имеет
Строит вид первого
str.size()
символы массива символов, начиная с элемента, указанногоstr.data()
,
Так что если string_view
просто указывает на базовый массив char предоставленной строки, тогда у нас будет висячий указатель, как только выражение закончится и временное уничтожится.
Как указано в комментариях, одна из причин, по которой такое поведение разрешено, заключается в том, что вы можете передать string_view
к функции и построить это string_view
из временного string
Других решений пока нет …