Срок службы временного объекта, переданного по ссылке в функцию

Да, подобные вопросы задавались и раньше, но они не были точно такими же (или, по крайней мере, предоставленных ответов мне было недостаточно).

Мой общий вопрос: каков срок жизни временного объекта, созданного при вызове функции?

Код:

#include <iostream>
#include <string>

using namespace std;

class A
{
public:
    A()
    {
        cout << "A()" << endl;
    }
    A(const A&)
    {
        cout << "A(const A&)" << endl;
    }
    A(A&&)
    {
        cout << "A(A&&)" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
};

class Container
{
public:
    A& getA()
    {
        return a;
    }

private:
    A a;
};

void f(A & a)
{
    cout << "f()" << endl;
}

int main()
{
    f (Container().getA());
    cout << "main()" << endl;
}

Это дает результат:

A()
f()
~A()
main()

Я создаю временный экземпляр Container и передаю ссылку на его поле функции f(). Вывод предполагает, что экземпляр Container начинает свою жизнь при вызове f(), живет до возврата из функции и только после этого уничтожается. Но, возможно, это случайность.

Что говорит стандарт? Действительна ли ссылка на Container::a в теле f()?


person NPS    schedule 18.02.2019    source источник
comment
В частности: Временные объекты уничтожаются в конце полного выражения, частью которого они являются..   -  person YSC    schedule 18.02.2019
comment
@YSC Спасибо, я не нашел этого вопроса. Значит, я могу безопасно использовать ссылку на Container::a в f()?   -  person NPS    schedule 18.02.2019
comment
define safe ^^ Как есть, да, это безопасно. Но код имеет тенденцию развиваться, и следующий программист может быть не так осторожен, как вы просили здесь. Если возможно, привязывайте временные файлы только к константным ссылкам.   -  person YSC    schedule 18.02.2019
comment
Извините за неточность, я имел в виду, действительна ли ссылка (потому что объект все еще существует) ?.   -  person NPS    schedule 18.02.2019
comment
Да, код в исходном виде безопасен: ссылка не переживает того, к чему она привязана.   -  person YSC    schedule 18.02.2019