Ссылка на временный и указатель на временные и их время жизни - PullRequest
0 голосов
/ 09 января 2019

Я прочитал много статей, касающихся времени жизни временного объекта, и кажется, что срок службы временного объекта в некоторых случаях увеличивается, тогда как в остальных случаях это висящий объект.

В моем случае временный объект возвращается из функции, я хочу понять, будет ли const ref для временного объекта оставаться действительным или нет.

Вот код:

class MyClass
{
public:
    std::vector<int> vec{ 1, 2 };

    MyClass()
    {
        cout << "Ctor" << endl;
    }

    MyClass(const MyClass &copy)
    {
        vec = copy.vec;         
        cout << "Copy Ctor" << endl;
    }

    ~MyClass()
    {
        cout << "Dtor" << endl;
    }
};

MyClass access()
{
    MyClass obj;
    obj.vec[0] = 10;
    return obj;
}

int main()
{
    {
        const auto &ret = access();             // calls the copy-ctor and assigns the temporary to reference 'ret'
        auto val = ret.vec[0];
        cout << "By Ref = " << val << endl;     // works fine
    }

    cout << "_____________________________________" << endl;

    {
        const auto *ret = &access();            // temporary is lost 
        auto val = ret->vec[0];                 // program crash
        cout << "By Pointer = " << val << endl; 
    }

    return 0;

}

1 Ответ

0 голосов
/ 09 января 2019

Срок службы только для временных ссылок, связанных с ссылками const, увеличивается, за исключением ссылок на const, связанных с возвратом функций, таких как

const int& f(){int x{42}; return x;}
int main()
{
    const int& bad = f(); // you'll end up with a dangling reference
}

или

const int& f(const int& x)
{
    return x;
}
int main(){
{
    const int& bad = f(42); // you'll end up (again) with a dangling reference
}

Во втором случае у вас есть указатель, поэтому временное время жизни правой части не увеличивается.

...