繁体   English   中英

将对象移动到 unique_ptr

[英]Move object into unique_ptr

我有类似代码

#include <iostream>
#include <memory>
#include <optional>

class D { 
    D(int i) : i(i), private_member('p') {}
    char private_member;
  public:
    D(const D&) = delete;
    D &operator=(const D&) = delete;
    
    D(D &&) = default;
    D &operator=(D &&) = default;
    
    static std::optional<D> try_create(int i) {
        return i > 10 ? std::make_optional<D>(i) : std::nullopt;
    }
    int i;
};

void accept_unique_ptr_only(std::unique_ptr<D> &ptr) {}

int main() {
    const auto d1 = D::try_create(10);
    const auto d2 = D::try_create(11);
    
    std::cout << (d1.has_value() ? std::to_string(d1->i) : "none1") << std::endl;
    std::cout << (d2.has_value() ? std::to_string(d2->i) : "none2") << std::endl;
}

class D来自外部库,因此遗憾地没有机会更改它。

虽然这有效,但我需要获得一个std::unique_ptr D确实实现了移动构造函数,所以我认为我可以将D移动到std::unique_ptr ,但我找不到允许我这样做的方法或构造函数。

在不访问构造函数本身的情况下,将D的实例移动到std::unique_ptr的最佳方法是什么?

使用std::make_unique ,所以是这样的:

// non-const
auto d1 = D::try_create(10);

// accounting for empty option
auto d1ptr = d1 ? std::make_unique(std::move(*d1)) : std::unique_ptr<D>();

生成的unique_ptr要么拥有D要么不依赖于std::optional 您必须使d1非常量,因为您需要对内部D进行非常量访问才能从中移动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM