作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是C++ 11中移动语义的新手,而且我不太清楚如何处理构造函数或函数中的unique_ptr
参数。考虑此类本身的引用:
#include <memory>
class Base
{
public:
typedef unique_ptr<Base> UPtr;
Base(){}
Base(Base::UPtr n):next(std::move(n)){}
virtual ~Base(){}
void setNext(Base::UPtr n)
{
next = std::move(n);
}
protected :
Base::UPtr next;
};
unique_ptr
参数的函数吗?
std::move
?
Base::UPtr b1;
Base::UPtr b2(new Base());
b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
最佳答案
以下是将唯一指针作为自变量及其相关含义的可能方法。
(A)按值(value)
Base(std::unique_ptr<Base> n)
: next(std::move(n)) {}
Base newBase(std::move(nextBase));
Base fromTemp(std::unique_ptr<Base>(new Base(...));
newBase
后,保证
nextBase
为空。您不拥有该对象,甚至不再有指向它的指针。它消失了。
std::move
实际上并没有移动任何东西。这只是一个花哨的 Actor 。
std::move(nextBase)
返回
Base&&
,它是对
nextBase
的r值引用。这就是全部。
Base::Base(std::unique_ptr<Base> n)
接受值而不是r值引用,所以C++会自动为我们构造一个临时变量。它根据我们通过
std::unique_ptr<Base>
提供的功能的
Base&&
创建一个
std::move(nextBase)
。正是这个临时结构的构造实际上将值从
nextBase
移到了函数参数
n
中。
Base(std::unique_ptr<Base> &n)
: next(std::move(n)) {}
Base newBase(std::unique_ptr<Base>(new Base)); //Illegal in this case.
Base newBase(nextBase);
nextBase
为空。它可能是空的;可能不会。这实际上取决于
Base::Base(std::unique_ptr<Base> &n)
想要做什么。因此,仅从函数签名中就不会很明显了。您必须阅读实现(或相关文档)。
Base(std::unique_ptr<Base> const &n);
const&
移出。通过传递
const&
,您说的是该函数可以通过指针访问
Base
,但无法将其存储在任何地方。它不能要求它的所有权。
const
一样)声明对它的所有权总是一件好事。他们无法存储它。他们可以将其传递给其他人,但是其他人必须遵守相同的规则。
Base(std::unique_ptr<Base> &&n)
: next(std::move(n)) {}
Base newBase(std::unique_ptr<Base>(new Base)); //legal now..
std::move
。 Base newBase(std::move(nextBase));
nextBase
应该为空。它应该已经从。毕竟,您坐在那里有
std::move
,告诉您发生了移动。
unique_ptr
的所有权,请按值取值。 unique_ptr
,请使用const&
。或者,将&
或const&
传递给所指向的实际类型,而不是使用unique_ptr
。 &&
对其进行取用。但是我强烈建议不要在可能的情况下这样做。 unique_ptr
。您只能移动它。正确的方法是使用
std::move
标准库函数。
unique_ptr
,则可以自由移动它。但是由于
std::move
,移动实际上并没有发生。采取以下声明:
std::unique_ptr<Base> newPtr(std::move(oldPtr));
std::unique_ptr<Base> &&temporary = std::move(oldPtr);
std::unique_ptr<Base> newPtr(temporary);
temporary
只是对
oldPtr
的r值引用。移动发生在
newPtr
的构造函数中。
unique_ptr
的move构造函数(将
&&
本身带给自己的构造函数)是实际的 Action 。
unique_ptr
值,并且想要将其存储在某个位置,则必须使用
std::move
进行存储。
关于c++ - 如何将unique_ptr参数传递给构造函数或函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941859/
我是一名优秀的程序员,十分优秀!