unique_ptr赋值运算符重载决策

时间:2015-03-17 10:45:29

标签: c++11 operator-overloading move unique-ptr rvalue-reference

unique_ptr应该与std :: move语义一起使用,并且为lvalues显式删除了复制赋值运算符,所以像

一样
unique_ptr<int> r = another_unique_ptr;

无效。

我在cpp reference上找到了以下签名:

unique_ptr& operator=( unique_ptr&& r ); (1)    
template< class U, class E >
unique_ptr& operator=( unique_ptr<U,E>&& r ); (1)   
unique_ptr& operator=( nullptr_t );     (2)     

但问题是

  

可修改的右值参考,Type&amp;&amp; ,愿意绑定   可修改的左值和可修改的右值

here所述。

在同一篇文章中,

部分
  

右值参考:重载决议

它声明

·初始化规则具有否决权。

·Lvalues强烈倾向于绑定到左值引用,而rvalues强烈倾向于绑定到右值引用。

·可修改的表达式弱于更喜欢绑定到可修改的引用。

没有规则会阻止左值绑定到签名中的右值引用参数。 (它只是“强烈偏好”,当没有更好的选择时,左值表达式将绑定到右值函数签名)

那么,使用std :: move有什么意义,它实际上将左值表达式转换为右值引用?

在一项实验中,我尝试了

unique_ptr<SomeType> r = another_unique_ptr;

错误信息很有趣,这证实了我上面所说的错误(但为什么???):

  

错误:使用已删除的函数'std :: unique_ptr&lt; _Tp,   _Dp&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,_Dp&gt;&amp;)[with _Tp = ITreeNode; _Dp = std :: default_delete&gt;]'
  typename ITreeNode :: UniquePtr ptr = rootPtr;

它正在寻找带左值参考的函数签名。 关于rvalue引用的重载决策,visual cpp博客是否错误?或者是因为我使用g ++ 4.8.2并且它的行为与vc ++编译器不同?然后哪个编译器给出正确/预期的行为?

请赐教!

0 个答案:

没有答案