unique_ptr和引用参数类型

时间:2016-03-03 10:30:41

标签: c++ c++11 smart-pointers

我有代码,我试图将unique_ptr的底层指针传递给通过引用接受指针的方法:

unique_ptr<A> a;

func(a.get());

致电:

void func(A*& a){   // I am modifying what `a` points to in here

}

但我收到编译器错误,因为get()没有返回我所期望的只是原始指针。是否有可能实现我在这里要做的事情?

3 个答案:

答案 0 :(得分:12)

不,这是件好事。

问题是get()会返回一个右值,而不是对unique_ptr内部指针的引用。因此,您无法修改它。如果可以的话,你会完全弄乱unique_ptr的内部状态。

如果要修改它,只需传递对unique_ptr本身的引用。

答案 1 :(得分:4)

通过引用获取指针的函数强烈暗示它可能会重新分配/删除有问题的指针。这意味着它要求所有权责任。调用这样一个函数的唯一安全方法是从唯一指针释放指针,并且(可能)在调用后重新获取它。

D = order C by $1 DESC;
E = limit D 1;
dump E;

但是如果(例如)// a currently manages (owns) the pointer std::unique_ptr<A> a; // release ownership of internal raw pointer auto raw = a.release(); // call function (possibly modifying raw) func(raw); // (re)claim ownership of whatever func() returns a.reset(raw); 有一个特殊的删除器并且函数没有相应地重新分配对象,那么这仍然会有问题。此外,如果函数删除指针而不将其设置为unique_ptr,则会出现问题。

答案 2 :(得分:3)

这是一个想法:

template<typename T> struct raw_from_ptr {
    raw_from_ptr(T& pointer) : _pointer(pointer), _raw_pointer(null_ptr) {}
    ~raw_from_ptr() {
        if (_raw_pointer != null_ptr)
            _pointer.reset(_raw_pointer);
    }
    raw_from_ptr(pointer_wrapper&& _other) : _pointer(_other._pointer) {
        std::swap(_raw_pointer, _other._raw_pointer);
    }
    operator typename T::pointer*() && { return &_raw_pointer; }
    operator typename T::pointer&() && { return _raw_pointer; }

private:
    T& _pointer;
    typename T::pointer _raw_pointer;
};

template<typename T> raw_from_ptr<T> get_raw_from_ptr(T& _pointer) {
    return raw_from_ptr<T>(_pointer);
}

用法:

unique_ptr<A> a;
func(get_raw_from_ptr(a));