【发布时间】:2018-03-12 13:12:18
【问题描述】:
我需要通过引用一个函数将唯一指针传递给派生类,该函数接受对基类的唯一指针的引用,如下所示:
#include <memory>
using namespace std;
class Base {};
class Derived : public Base {};
void foo(std::unique_ptr<Base>& d){}
int main()
{
unique_ptr<Derived> b = make_unique<Derived>();
foo(b);
}
为什么这段代码不起作用?我查看了this one 之类的其他帖子,答案似乎是“因为 C++ 希望类型完全匹配”,但这是为什么呢?我可能会造成什么危险情况?
-
如果我这样做,它会编译:
void foo(unique_ptr<Base>&& d){} foo(move(b));这是一个合理的方法吗?
【问题讨论】:
-
为什么不直接接受
Base&?你对函数中的unique_ptr做了什么? -
然后按值取
unique_ptr。 -
@Valentin 但是有一个移动构造函数。您希望
foo拥有指针的所有权,不是吗?按值取值,调用为foo(std::move(b)) -
然后在调用点移动它。
-
至于为什么您的原始方法不起作用:
std::uniqe_ptr<Base>和std::unique_ptr<Derived>是两个截然不同的、不相关的类。即使Derived是从Base派生的,std::unique_ptr<Derived>也不是从std::uniqe_ptr<Base>派生或以其他方式与std::uniqe_ptr<Base>相关的。它不起作用的原因与您不能将Apple的实例传递给采用Orange&的函数的原因相同。
标签: c++ c++11 move smart-pointers