[英]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.