Как избежать висящей ссылки с R-значением - PullRequest
0 голосов
/ 03 мая 2018

Некоторое обсуждение предупреждает о свисающей ссылке со ссылкой 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-значении?

1 Ответ

0 голосов
/ 03 мая 2018

In :

auto test = test_rvalue(); перемещает возвращаемое значение test_rvalue() в test. Этот ход затем исключается каждым компилятором, не поврежденным мозгом, поэтому он никогда не происходит. Конструктор перемещения все еще должен существовать, но никогда не вызываться, и никаких побочных эффектов перемещения не возникает.

auto&& test = test_rvalue(); привязывает ссылку rvalue к временному значению, возвращенному test_rvalue(). Временной срок службы продлен до соответствия с эталоном.

In :

auto test = test_rvalue(); возвращаемое значение prvalue test_rvalue() используется для непосредственного построения переменной test. Движение не выполняется, исключено или нет.

Случай auto&& остается неизменным с .

...