为什么不unique_ptr只接受一个临时的发呢?
Why not unique_ptr made to accept only a temporary?
This SO post 似乎表明语言确实支持只接受参数的临时变量。
为什么 unique_ptr 设计为接受别名指针,如下所示:
auto ptr = new Widget{};
auto uptr = std::unique_ptr<Widget>(ptr);
为什么不限制为:
auto uptr = std::unique_ptr<Widget>(new Widget{});
因为这没有用。
要求指针由给定删除器的合适分配函数创建,这与临时指针不同。
您无法通过值类别区分由 new
表达式、函数调用和 &
运算符创建的指针 - 它们都是右值。
据我所知没有充分的理由,我认为这是库中 C++ 语言的开发不足。
我问了同样的问题
我仍然找不到不让 std::unique_ptr
的构造函数仅接受来自 new
或工厂的右值引用的充分理由。在这里,我将其作为答案而不是评论,将其与我不同意的其他答案放在同一级别。
如果你真的需要接受一个现有的指针,你总是可以转换,那就是使用std::move
。所以这不是借口,因为那不是常态。
This SO post 似乎表明语言确实支持只接受参数的临时变量。
为什么 unique_ptr 设计为接受别名指针,如下所示:
auto ptr = new Widget{};
auto uptr = std::unique_ptr<Widget>(ptr);
为什么不限制为:
auto uptr = std::unique_ptr<Widget>(new Widget{});
因为这没有用。
要求指针由给定删除器的合适分配函数创建,这与临时指针不同。
您无法通过值类别区分由 new
表达式、函数调用和 &
运算符创建的指针 - 它们都是右值。
据我所知没有充分的理由,我认为这是库中 C++ 语言的开发不足。
我问了同样的问题
我仍然找不到不让 std::unique_ptr
的构造函数仅接受来自 new
或工厂的右值引用的充分理由。在这里,我将其作为答案而不是评论,将其与我不同意的其他答案放在同一级别。
如果你真的需要接受一个现有的指针,你总是可以转换,那就是使用std::move
。所以这不是借口,因为那不是常态。