Неявное преобразование std::string -> std::string_view
// Вектор заполняется всякой фигней:
#include <iostream>
#include <vector>
#include <string_view>
#include <algorithm>
using namespace std;
int main() {
vector<string> s{"aaa", "bbb", "aaa", "aaa"};
vector<string_view> vs(4);
transform(s.begin(), s.end(),
vs.begin(),
[](auto& data) {return data;});
for (auto item: vs) {
cout << item.data() << " "; // Вывод: ��o ��o ��o ��o
}
cout << endl;
for (auto item: vs) {
cout << item << " "; // Вывод: �@" �@" �@" �@"
}
cout << endl;
}
// А так все нормально
#include <iostream>
#include <vector>
#include <string_view>
#include <algorithm>
using namespace std;
int main() {
vector<string> s{"aaa", "bbb", "aaa", "aaa"};
vector<string_view> vs(4);
transform(s.begin(), s.end(),
vs.begin(),
[](auto& data) -> string_view {return data;});
for (auto item: vs) {
cout << item.data() << " "; // Вывод: aaa bbb aaa aaa
}
cout << endl;
for (auto item: vs) {
cout << item << " "; // Вывод: aaa bbb aaa aaa
}
cout << endl;
}
Почему в первом случае не происходит неявного преобразования из string в string_view? Точнее, оно скорее всего происходит, но для какого-то временного значения, область видимости которого - функция std::transfor. Объясните пожалуйста, почему так происходит?
Я понимаю, что функция std::transform возвращает строку - копию элемента исходного вектора, поэтому представление string_view получает указатель на данные, область видимости которых ограничена функцией std::transform. Все верно? Получается, без явного каста здесь никак не обойтись? Указать функции std::transform возвращать ссылку на элемент исходной последовательности невозможно?