Неявное преобразование 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 возвращать ссылку на элемент исходной последовательности невозможно?
Ответы (1 шт):
Вот здесь auto не прикрепился к ссылке:
#include <iostream>
using namespace std;
int &returner(int &some_number){
return some_number; }
int main() {
int x = 10;
auto lets_show_it = returner(x);
cout<<endl<<endl;
cout<<"OUR X NUMBER "<<x<<" "<<&x<<endl;
cout<<"LETS SHOT IT "<<lets_show_it<<" "<<&lets_show_it<<endl;
cout<<endl<<endl;
lets_show_it = 15;
cout<<"OUR X NUMBER "<<x<<" "<<&x<<endl;
cout<<"LETS SHOT IT 2 "<<lets_show_it<<" "<<&lets_show_it<<endl;
}
Вот здесь auto прикрепился к ссылке:
#include <iostream>
using namespace std;
int &returner(int &some_number){
return some_number;
}
int main()
{
int x = 10;
decltype(auto) lets_show_it = returner(x);
cout<<endl<<endl;
cout<<"OUR X NUMBER "<<x<<" "<<&x<<endl;
cout<<"LETS SHOT IT "<<lets_show_it<<" "<<&lets_show_it<<endl;
cout<<endl<<endl;
lets_show_it = 15;
cout<<"OUR X NUMBER "<<x<<" "<<&x<<endl;
cout<<"LETS SHOT IT 2 "<<lets_show_it<<" "<<&lets_show_it<<endl;
}
Запись decltype(auto) - компилятор нативно поймет, что нужно int&

