移动涉及 const unique_ptr 的构造函数

新手上路,请多包涵

在下面的代码中,我设置了 p const 因为它在 Foo 的生命周期内永远不会指向任何其他 int。这不会编译,因为调用了 unique_ptr 的复制构造函数,这显然被删除了。除了使 p 非常量之外,还有其他解决方案吗?谢谢。

 #include <memory>

using namespace std;

class Foo
{
public:
  //x is a large struct in reality
  Foo(const int* const x) : p(x) {};
  Foo(Foo&& foo) : p(std::move(foo.p)) {};
private:
  const unique_ptr<int> p;
};

原文由 Agrim Pathak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 656
2 个回答

您的移动构造函数的语义是矛盾的。

您已经声明了一个 const std::unique_ptr 它将(唯一地)拥有它初始化的值。 但是 您已经声明了一个移动构造函数,它应该在构造时将该值移动到另一个对象中。

那么,您认为 std::unique_ptr 在构建的“临时”中应该发生什么?

如果您希望它是 release() ed,那么您就违反了它的 const 。如果您希望它保留其值,则您违反了 std::unique 的约束,该约束要求不超过一个此类对象拥有任何给定对象。 将死。

这个问题揭示了 C++ 语言的一个微妙的限制。它需要 move 语义以将复制 对象保留为有效对象。

有几个非常合理的“破坏性移动”建议实际上可以更好地反映 move 的大多数用途正在做的事情 - 从那里“使”那里的东西“无效”。

谷歌他们。我没有做过文献调查,所以不想推荐一个。

您在这里的替代方法是删除 const 或强制转换。我强烈建议删除它。您可以确保类的语义确保适当的 const-ness 没有影响,也没有“丑陋的嫌疑人” const_cast

 #include <iostream>
#include <memory>

class Foo
{
public:
  Foo(const int x) : p(new int(x)) {};
  Foo(Foo&& foo) :
    p(std::move(foo.p)) {

    };

    int get(void)const{
        return *(this->p);
    }

private:
     std::unique_ptr<int> p;
};

Foo getMove(){
    return Foo(88);
}

int main(){

    Foo bar(getMove());
    std::cout<<bar.get()<<std::endl;

    return EXIT_SUCCESS;
}

原文由 Persixty 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 std::unique_ptr 的概念表示对象的唯一所有权。您想要实现的是让 Foo 类拥有一个对象(由 std::unique_ptr 表示) 使其可移动(您的移动构造函数),这会产生矛盾。我会坚持使用 std::unique_ptr 或使用 std::shared_ptr 共享它。

您可能想阅读以下内容: 智能指针:或者谁拥有您的宝贝?

原文由 szulak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题