Давайте go через эти по одному:
auto i = f(1); // (1)
Это создает локальную переменную i
(не ссылку), инициализированную с возвращаемым значением f(1)
. Хорошо. Время жизни i
до конца блока.
p && j = f(2); // (2)
Инициализирует ссылку j
ссылкой на объект, возвращаемый f(2)
, и это продлевает время жизни значения возвращается f(2)
, так что все в порядке. Время жизни j
до конца блока.
p && k = move(f(3)); // (3)
Инициализирует ссылку со ссылкой на объект, возвращаемый move
, продление срока действия не происходит, поскольку значение, возвращаемое move
является ссылкой на временное значение, возвращаемое f(2)
(а не временным объектом), но временное значение, возвращаемое f(2)
, умирает, как только k
инициализируется, так как его время жизни не увеличивается (это не присваивается ссылочной переменной), и k
оказывается висячей ссылкой.
auto l = move(f(4)); // (4)
То же, что (1), движение бесполезно. Время жизни l
до конца блока.
p ptr = make_shared<A>(5); // (5)
Это инициализация локальной переменной. Время жизни ptr
- до конца блока.
auto && a = move(ptr);
a
является ссылкой на ptr
. Это не меняет время жизни ptr
.