Неявное преобразование std::string -> std::string_view

Рейтинг: 2Ответов: 1Опубликовано: 27.05.2023
// Вектор заполняется всякой фигней:
#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 возвращать ссылку на элемент исходной последовательности невозможно?

Ответы

▲ 0

Вот здесь 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&