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 ++编译器不同?然后哪个编译器给出正确/预期的行为?
请赐教!