唯一指针作为默认参数

时间:2018-01-30 17:17:46

标签: c++ c++11 pointers unique-ptr

我试图将nullpointer包装为一个唯一的指针作为函数的默认参数。仅使用指针,标题可能如下所示

double f(A* vec = nullptr);

因为我需要使用unique_ptr,所以我尝试将其更改为

double f(std::unique_ptr<A>& A vec = nullptr);

double f(std::unique_ptr<A>& A vec = std::unique_ptr<A>(nullptr));

导致错误

  

无法将'nullptr'从'std :: nullptr_t'转换为'std :: unique_ptr&amp;'

  

不能将'std :: unique_ptr&amp;'类型的非const左值引用绑定到'std :: unique_ptr'类型的右值

respecively。有没有办法做到这一点?我对C ++比较陌生,所以答案可能很明显。

与问题无关,但是我选择unique_ptr的解释:参数vec用作f中迭代的起始值,并使用指针返回改进的值。计划是如果没有给出起始值,则将指针设置为nullptr,并在程序期间计算起始值。但是,由于我生成了一个新对象,所以我可以看到在裸指针上使用unique_ptr更安全。

3 个答案:

答案 0 :(得分:8)

我想说你在这里有两个选项。

1)该函数不拥有它只使用它的指针。在这种情况下,传递一个原始指针或(更好)一个引用(如果nullptr不是一个选项)。

// correct way to express a call to a non-owning function.
double f(A* vec = nullptr);

调用代码将使用如下函数:

std::unique_ptr<A> vec;

f(vec.get()); // pass the raw pointer to the function

2)该函数需要管理指针的生命周期或重置指针(拥有它),在这种情况下接受std::unique_ptr

// way to express transfer of ownership to a function
double f(std::unique_ptr<A> vec = std::unique_ptr<A>());

如果函数需要获取指针的所有权,则实际上不需要接受引用。

在讨论中,第三个选项已经出现。

3)如果您在中传递,该函数应该修改指针它将使用自己的内部指针。

这很不寻常,但你可以用一对像这样的重载函数来做到这一点:

// way to express a function that modifies a smart pointer
// (for example reseating it)
double f(std::unique_ptr<A>& vec);

// version where the uses doesn't want to supply the pointer
// and doesn't care about the modified value.
double f() 
{
    std::unique_ptr<A> vec; // a dummy
    f(vec); // pass in the dummy
}

答案 1 :(得分:3)

第二个错误是因为你将一个非const引用绑定到一个rvalue(就像它所说的那样)。如果这是必须的,则不能使用默认值,也不能使用const引用:

double f(const std::unique_ptr<A>& A vec = std::unique_ptr<A>(nullptr));

答案 2 :(得分:3)

double f(std::unique_ptr<A>& vec = nullptr);
由于编译器必须从std::unique_ptr创建临时nullptr,因此

无法正常工作。你用过

double f(std::unique_ptr<A> const& vec = nullptr);

编译器会接受它。

一种解决方法是超载。

double f(std::unique_ptr<A>& vec)
{
   return 0;
}

double f()
{
   std::unique_ptr<A> vec = nullptr;
   return f(vec);
}