我是新手在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;
};
Run Code Online (Sandbox Code Playgroud)
这是我应该如何编写unique_ptr参数的函数?
我需要std::move在调用代码中使用吗?
Base::UPtr b1;
Base::UPtr b2(new Base());
b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
Run Code Online (Sandbox Code Playgroud) 根据" 如何绕过警告"rvalue用作左值"? ",Visual Studio只会警告代码如下:
int bar() {
return 3;
}
void foo(int* ptr) {
}
int main() {
foo(&bar());
}
Run Code Online (Sandbox Code Playgroud)
在C++中,不允许获取临时(或者至少是由rvalue表达式引用的对象?)的地址,我认为这是因为临时保证甚至不能保存.
但是,虽然诊断程序可能以编译器选择的任何形式呈现,但我仍然期望MSVS 出错而不是在这种情况下发出警告.
那么,临时保证有储存吗?如果是这样,为什么上面的代码首先被禁止?
假设我有一个只有一个构造函数的类:
class T {
public:
T(BigClass&& big) : big(std::move(big)) {}
...
SomeBigClass
};
Run Code Online (Sandbox Code Playgroud)
在大多数地方,构造函数在temporaries上调用,但在一个地方我需要制作BigClass的显式副本,因为它不是临时的,并且将在循环中多次使用:
void foo(const BigClass& big) {
while (...) {
T t(std::make_a_copy(big));
...
}
}
Run Code Online (Sandbox Code Playgroud)
std::move在C++ 11或C++ 14中是否有任何"双重"功能可以取代上面的make_a_copy?
编辑:一些澄清.