This SO帖似乎暗示语言确实只支持接受临时论点。
为什么unique_ptr设计为接受别名指针,如下所示:
auto ptr = new Widget{};
auto uptr = std::unique_ptr<Widget>(ptr);
为什么不限制为:
auto uptr = std::unique_ptr<Widget>(new Widget{});
答案 0 :(得分:1)
因为这没有帮助。
要求指针是由给定删除器的合适分配函数创建的,这与临时不同。
您无法区分由new
表达式,函数调用和&
运算符创建的指针值类别 - 它们都是右值。
答案 1 :(得分:-1)
据我所知,没有充分的理由,我认为这是对图书馆C ++语言的开发不足。
我问了同样的问题Why is raw pointer to shared_ptr construction allowed in all cases?
我仍然没有找到一个很好的理由不让std::unique_ptr
的构造函数接受来自new
或来自工厂的r值引用。在这里,我把它作为答案,而不是作为评论,把它放在与我不同意的另一个答案的同一级别。
如果你真的需要接受现有的指针,你总是可以使用std::move
进行强制转换。因此,这不是一个借口,因为这不是常态。