这个例子是在 iOS 的上下文中,但原则适用于其他地方......
// global variable...
std::unique_ptr<Foo> global_foo_handle;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// use Obj-C to compute a valid path string
const char * path = [[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithUTF8String: "file.txt"]] UTF8String];
// Only now can I call the ctor of my foo.
global_foo_handle = std::move(std::unique_ptr<Foo>(new Foo(path)));
}
这对我来说真的看起来不是那么理智。没有更清洁的方法吗?我看到唯一有效的 unique_ptr operator =
是移动分配。我想很清楚这里正在做什么。似乎我也可以省略 std::move
,只要为新分配的 Foo 制作的临时 unique_ptr
仍然是临时的,而不是被制成左值。
我想我有点想知道为什么没有一个 operator= 接受指向 T
的指针?这样我们就跳过了临时 unique_ptr 的创建。
最佳答案
你不需要 std::move
...
global_foo_handle = std::unique_ptr<Foo>(new Foo(path));
或者您可以重置值...
global_foo_handle.reset(new Foo(path));
但是,您必须了解删除器是 unique_ptr 类型的一部分,任何通过reset
分配给 unique_ptr 的指针都将被原始 unique_ptr 对象的删除器删除。
关于c++ - 保留 `unique_ptr` 未设置,直到我准备好分配它 : Is this how I re-assign it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22740608/