Since C++14 std::make_pair
is defined as
template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );
where V1
and V2
are std::decay<T1>::type
and std::decay<T2>::type
respectively.
This means that your make_pair<const int&, int>
calls do not really produce pairs with references as their first elements (contrary to what you apparently believed). They actually produce temporaries of pair<int, int>
type. At this point you lose any attachment to the original int
object stored in your unique_ptr
.
When you pass these pair<int, int>
temporaries to push_back
, they get implicitly converted to temporaries of pair<const int&, int>
type, which is your vector's element type. Through this mechanism you attach references inside your vector's element to int
members of those pair<int, int>
temporaries produced by make_pair
(not to int
objects stored in your unique_ptr
s). Once the temporaries expire, the references go sour.
In this case you can eliminate this specific problem by avoiding make_pair
altogether and simply directly constructing std::pair
objects of proper type, e.g.
vector.push_back(std::pair<const int&, int>(*ptr, 11));
but you might run into other problems caused by raw references later.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…