理解shared_ptr的问题

时间:2011-08-05 18:05:40

标签: c++ reference shared-ptr

我有一个:

template<class K,class V>
struct Node
{
node_ptr parent_;//node_ptr is a shared_ptr<Node<K,V>>
node_ptr& get_parent()const
{
return parent_;
}
void set_parent(node_ptr& p)
{
parent_ = p;
}
//the get set for left and right are analogical
};

我无法理解为什么会这样:

auto zz = get_parent(get_parent(z));
rb_left_rotate(t,zz);

但这不是:

rb_left_rotate(t,get_parent(get_parent(z)));

通过作品我的意思是在rb_left_rotate里面我有:

template<class Tree_T, class Node_T>
void rb_left_rotate(Tree_T& t,Node_T& x)
{
    auto y = get_right(x);
    set_right(x,get_left(y));
    if (get_left(y))
    {
        set_parent(get_left(y),x);
    }
    auto tmp = get_parent(x);
    //y's current parrent is x
    set_parent(y,tmp);//by works I mean that this line WILL NOT set x to empty
......
}

2 个答案:

答案 0 :(得分:2)

rb_left_rotate()接受Node_T作为对非const的引用。这样的引用只能绑定到l值,即非临时对象。 auto zz = get_parent(get_parent(z));创建了一个名为zz的l值。另一方面,在表达式rb_left_rotate(t,get_parent(get_parent(z)));中,get_parent(z)的结果是一个r值,即一个临时值,它不能绑定到对非const的引用。

这与您使用智能指针无关。

答案 1 :(得分:0)

NodeNode_T之间的关系是什么?

您如何将get_parent声明为无参数成员函数,但是通过传递参数来调用它?

似乎唯一可能修改x的是行:

set_right(x,get_left(y));

set_right做了什么?

一般情况下,如果将shared_ptr s作为真值传递,而不是引用shared_ptr,则可能会获得更可预测的行为。