Это безопасно в данном конкретном случае. Однако обратите внимание, что не все временные данные безопасны для захвата с помощью константной ссылки ... например,
#include <stdio.h>
struct Foo {
int member;
Foo() : member(0) {
printf("Constructor\n");
}
~Foo() {
printf("Destructor\n");
}
const Foo& method() const {
return *this;
}
};
int main() {
{
const Foo& x = Foo{}; // safe
printf("here!\n");
}
{
const int& y = Foo{}.member; // safe too (special rule for this)
printf("here (2)!\n");
}
{
const Foo& z = Foo{}.method(); // NOT safe
printf("here (3)!\n");
}
return 0;
}
Ссылка, полученная для z
, небезопасна для использования, поскольку временный экземпляр будет уничтожен в концеполное выражение, до достижения оператора printf
. Выход:
Constructor
here!
Destructor
Constructor
here (2)!
Destructor
Constructor
Destructor
here (3)!