1

Тема: Цікаве виведення типів з auto

зіткнувся з цікавою штукою:

    vector<int> *pvi = new vector<int>;
    pvi->push_back(1);

    // завдяки тому, що auto використовує ті ж (майже) правила, що і при виведенні типів в шалонах
    // ми отримали тут int, а не int&
    auto i0 = (*pvi)[0];
    i0 = 5;
    // тому тут ми все ще побачили 1
    cout << (*pvi)[0] << endl;
    delete pvi;

    // і тут нема невизначеної поведінки
    i0 = 1;
    cout << i0 << endl;
    cout << typeid(i0).name() << endl;

маємо:

1
1
int

2

Re: Цікаве виведення типів з auto

Не зрозумів, що тут цікавого? Ви ж робите не

auto &i0 = (*pvi)[0];

3

Re: Цікаве виведення типів з auto

koala написав:

Не зрозумів, що тут цікавого? Ви ж робите не

auto &i0 = (*pvi)[0];

Ось означення оператора в vector

reference operator[](size_type _Pos) {...}

Тобто він повертає int&, але тут нас рятує те, що auto не повністю виводить тип. Якби я написав так

decltype(auto) i0 = (*pvi)[0];

То була б невизначена поведінка, просто цікаво, як auto виводить типи.

4

Re: Цікаве виведення типів з auto

auto працює за тими ж правилами що і вивід типів шаблона (template type deduction), за виключенням виводу списків ініціалізації (std::initializer_list). А вивід типів шаблону ігнорує reference-частину параметру.
Це добре розписано в останній книзі Мейерса http://ftp.coollib.net/b.usr/Skott_Meye … iy_C++.pdf Перша глава 1.1 -1.2

Подякували: koala, Yola2