Некоторое обсуждение предупреждает о свисающей ссылке со ссылкой R-значения. В следующем примере я не вижу висящей ссылки, поскольку DTOR был вызван, когда main () завершается. Я что-то упустил?
class test_ctor
{
public:
explicit
test_ctor(int x = 1):_x(x)
{
std::cout << "CTOR: " << _x << "\n";
}
~test_ctor()
{
std::cout << "DTOR: " << _x << "\n";
}
test_ctor(test_ctor const & y) = default;
test_ctor(test_ctor && y) = default;
int _x;
};
test_ctor test_rvalue()
{
test_ctor test = test_ctor(2);
return test;
}
Теперь я могу использовать приведенный выше код двумя способами:
int main(int argc, const char * argv[]) {
auto test = test_rvalue();
std::cout << " test: " << test._x << " \n";
return 0;
}
Или
int main(int argc, const char * argv[]) {
auto && test = test_rvalue();
std::cout << " test: " << test._x << " \n";
return 0;
}
оба случая имеют одинаковый вывод:
CTOR: 2
тест: 2
DTOR: 2
Это означает, что оба являются эффективными способами возврата объекта. Есть ли побочные эффекты в r-значении?