T&& operator[](std::size_t n) && noexcept {std::cout<<"move"<<std::endl; return std::move(vec[n]); }
Я не могу получить ожидаемый результат в этой части.
Я предсказываю, что произойдет висячая ссылка.
T operator[](std::size_t n) && noexcept {std::cout<<"move"<<std::endl; return std::move(vec[n]); }
Это хорошо работает.
Почему T&& не увеличивает срок службы?
#include <iostream>
#include <stdlib.h>
#include<vector>
template<typename T, typename Alloc = std::allocator<T>>
class my_vector
{
std::vector<T, Alloc> vec;
public:
my_vector(std::initializer_list<T> init) : vec{init} {}
T&& operator[](std::size_t n) && noexcept {std::cout<<"move"<<std::endl; return std::move(vec[n]); } // moveしたものを参照するとごみを参照してることになる
//T operator[](std::size_t n) && noexcept {std::cout<<"move"<<std::endl; return std::move(vec[n]); }
};
int main()
{
auto&& vec = my_vector<int>{1, 2, 3}[0]; //case3 move
std::cout<<vec<<std::endl; //0
}





Для auto&& vec = my_vector<int>{1, 2, 3}[0]; ссылка не привязана к временному (т.е. my_vector<int>{1, 2, 3}) напрямую, его продолжительность жизни не будет расширен.
In general, the lifetime of a temporary cannot be further extended by "passing it on": a second reference, initialized from the reference variable or data member to which the temporary was bound, does not affect its lifetime.
С другой стороны, если вы измените тип возвращаемого значения operator[] на T, то то, что он возвращает (например, my_vector<int>{1, 2, 3}[0]), является временным и привязывается к vec, тогда его время жизни продлевается до времени жизни vec.