Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量正确性、标准移动和智能指针_C++_Smart Pointers - Fatal编程技术网

C++ 常量正确性、标准移动和智能指针

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

我很难理解何时应该使用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_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语句将局部变量和函数参数视为右值,以尝试移动它们(更高效)。