悬挂参考解决方案
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
.
的生命周期
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
.