我是新手在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) 假设我有处理基类和派生类的工厂函数:
#include <memory>
using namespace std;
struct B { virtual ~B() {} };
struct D : B {};
unique_ptr<B> MakeB()
{
auto b = unique_ptr<B>( new B() );
return b; // Ok!
}
unique_ptr<B> MakeD()
{
auto d = unique_ptr<D>( new D() );
return d; // Doh!
}
Run Code Online (Sandbox Code Playgroud)
在上面的最后一行,我需要move(d)为了使它工作,否则我得到"错误:无效转换std::unique_ptr<D>为std::unique_ptr<D>&&." 我的直觉说,在这种情况下,编译器应该知道它可以隐式地创建d一个rvalue并将其移动到基指针中,但事实并非如此.
这在我的编译器(gcc 4.8.1和VS2012)中是不可靠的吗?预期的设计unique_ptr?标准有缺陷吗?
我有一个unique_ptr,我想添加到vector>.
unique_ptr<Derived> derivedObject;
vector<unique_ptr<Base>> vec;
vec.push_back(derivedObject) // Invalid arguments
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
#include <iostream>
#include <memory>
class Base
{
public:
virtual void doSmth() = 0;
};
class Der1 : Base
{
public:
void doSmth() final
{
std::cout << "Hello from der1\n";
}
};
class Der2 : Base
{
public:
void doSmth() final
{
std::cout << "Hello from der2\n";
}
};
class Owner
{
public:
Owner(std::unique_ptr<Base> passedptr)
{
ptr = std::move(passedptr);
}
std::unique_ptr<Base> ptr;
};
int main()
{
auto der = std::make_unique<Der1>();
Owner owner(std::move(der)); // Fails, need to convert
owner.ptr->doSmth();
}
Run Code Online (Sandbox Code Playgroud)
我希望该类 …