在功能签名中区分临时和非临时?

时间:2016-01-09 04:50:45

标签: c++ c++11 rvalue-reference temporary

我想创建一个可以区分临时和非临时非临时的类Bar。根据{{​​3}},如果第二个StealPointer采用const引用(在我的情况下是一个指针),我可以逃脱这个,但在我的代码中它只使用StealPointer(Foo *&& foo)版本无论如何调用它。

class Foo {};

class Bar {
 public:
  // For when StealPointer(new Foo()); is called. Bar instance then owns the
  // pointer.
  void StealPointer(Foo*&& foo) {} // Get the temporaries only.

  // For when a Foo* already exists and is passed in StealPointer(my_foo_ptr);
  // Takes ownership and invalidates the pointer that the caller once had.
  void StealPointer(Foo*&) {} // Get lvalues only.
};

我可以这样做吗?有没有办法做到这一点,只需要一个功能?如果重要,Bar会将指针存储在unique_ptr中,我想避免传入unique_ptr或让调用者使用std :: move执行某些操作的其他语法。我不能只通过引用传递指针,因为Foo *类型的临时工具无法转换为Foo *&。

1 个答案:

答案 0 :(得分:3)

让您的功能模板化,让std::unique_ptr为您担心这些细节。

template <typename Ptr>
void StealPointer(Ptr&& p) // a universal reference, matches *any* type of value
{
    uniqptr = std::move(p); // Works for both rvalues and lvalues
}