我试图将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更安全。
答案 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);
}