悬挂参考解决方案

Dangling reference solution

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}),它的lifetime不会被扩展。

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[] 的 return 类型更改为 T,那么 return 是什么(即 my_vector<int>{1, 2, 3}[0])是临时的,绑定到 vec,然后它的生命周期延长到 vec.

的生命周期