C++ 常量正确性、标准移动和智能指针
我很难理解何时应该使用const智能指针以及何时移动它们 基于以下代码:C++ 常量正确性、标准移动和智能指针,c++,smart-pointers,C++,Smart Pointers,我很难理解何时应该使用const智能指针以及何时移动它们 基于以下代码: class Foo; class Bar; typedef std::shared_ptr<Foo> FooPtr; typedef std::shared_ptr<Bar> BarPtr; class Bar { }; class Foo { public: static FooPtr create() { FooPtr f = std::make_shar
class Foo;
class Bar;
typedef std::shared_ptr<Foo> FooPtr;
typedef std::shared_ptr<Bar> BarPtr;
class Bar {
};
class Foo {
public:
static FooPtr create()
{
FooPtr f = std::make_shared<Foo>();
f->initialize();
return f;
}
void setData(const BarPtr& b) {
m_b = b;
}
private:
BarPtr m_b;
};
inline const FooPtr& internalCreateFoo(const BarPtr& b)
{
FooPtr foo = Foo::create();
foo->setData(b);
int id = foo->getID();
m_foos[id] = std::move(foo);
return m_foos[id];
}
Foo类;
分类栏;
typedef std::shared_ptr FooPtr;
typedef std::shared_ptr BarPtr;
分类栏{
};
福班{
公众:
静态fooptrcreate()
{
FooPtr f=std::make_shared();
f->initialize();
返回f;
}
无效设置数据(常数BarPtr&b){
m_b=b;
}
私人:
巴普特穆布;
};
内联常量FooPtr&internalCreateFoo(常量BarPtr&b)
{
FooPtr foo=foo::create();
foo->setData(b);
intid=foo->getID();
m_foos[id]=std::move(foo);
返回m_foos[id];
}
1:std::move(foo)在这里真的有必要吗
2:如果将foo
创建为const
,例如const FooPtr&foo=…
,那么关于std::move
会发生什么
std::move(foo)
在这里真的有必要吗
必要的,不,有用的,是的。如果没有std::move
,foo
是一个左值,因此它将导致复制。这可能是低效的。由于不再需要foo
,因此将其移动到数组中而不是复制它是有意义的
如果foo
被创建为const
,比如constfooptr&foo=…
,那么关于std::move
会发生什么
然后你会得到一份副本。不能移动常量为const的对象,因为移动会更改“已从”对象的状态1
1:理论上,移动可能不需要改变从对象移动的状态,但无论如何,您只需要复制一个副本。为什么要移动指针?这就像移动一个int。为什么要使用共享的ptr?请注意,工厂方法返回共享ptr通常是个坏主意。它最好删除一个唯一的ptr,这样接收方就可以自由地更改所有权。std::static\u pointer\u cast
Foo::create()
已经返回匹配的类型。“move”const对象通常以copy结尾。@IgorTandetnik这实际上是smart_ptrs持有的类型转换,但我简化了代码,忘了去掉它。@ypnos据我所知,int
是一个原语,smart\u ptr
是一个完整的数据结构。如果在某些场景中使用return std::move(foo)
,移动是否已经隐式了?@Alexandreservino除了几个例外,不需要return std::move(foo)
。return语句将局部变量和函数参数视为右值,以尝试移动它们(更高效)。