C++11 为什么不制作唯一的ptr,只接受临时的?

C++11 为什么不制作唯一的ptr,只接受临时的?,c++11,smart-pointers,C++11,Smart Pointers,所以波斯特似乎认为,语言确实支持只为论点而接受临时词语 那么,为什么unique_ptr设计用于接受别名指针,如下所示: auto ptr = new Widget{}; auto uptr = std::unique_ptr<Widget>(ptr); autoptr=newwidget{}; 自动uptr=std::唯一ptr(ptr); 为什么不仅限于: auto uptr = std::unique_ptr<Widget>(new Widget{}); au

所以波斯特似乎认为,语言确实支持只为论点而接受临时词语

那么,为什么unique_ptr设计用于接受别名指针,如下所示:

auto ptr = new Widget{};
auto uptr = std::unique_ptr<Widget>(ptr);
autoptr=newwidget{};
自动uptr=std::唯一ptr(ptr);
为什么不仅限于:

auto uptr = std::unique_ptr<Widget>(new Widget{});
autouptr=std::unique\u ptr(新小部件{});

因为这没有帮助


需要为给定的deleter通过合适的分配函数创建指针,这与它是临时的不同


您不能区分由代码创建的指针>新的<代码>表达式、函数调用和由代码类别>代码> >代码>操作符,它们都是rValue.< /P> < P>没有好的理由,据我所知,我认为这是对库中C++语言的一个欠开发。

我问了同样的问题

我仍然没有找到一个很好的理由不让
std::unique\u ptr
的构造函数只接受来自
new
或工厂的r值引用。在这里,我把它作为一个答案,而不是作为一个评论,把它放在我不同意的另一个答案的同一个层次上


如果确实需要接受现有指针,则始终可以强制转换,即使用
std::move
。因此,这不是借口,因为这不是标准。

为什么不将其限制为仅使用
std::make_unique()
?第一种情况实际上非常有效,但如果在两行之间添加更多代码,则很容易变得异常不安全。第一个指针称为观察者指针,而
uptr
称为“拥有指针”。让多个观察者指针指向同一资源没有什么错。另外,
std::unique_ptr
应该接受从现有的“原始拥有指针”获取所有权,这样它就可以在现有的代码库中使用,而不会破坏现有的API。@kaboissoneault,在这种情况下,您可以使用
std::unique_ptr up(std::move(ptr))哪些标志表明您正在进行潜在危险的操作。请看我的答案。@alfC可能就是我,但我认为对基本类型使用右值引用永远都不是解决任何问题的正确方法。@alfC:“那么这个问题是唯一的吗?\u ptr a basical type?”他说的是采用
t*&&
。指针是基本类型。至于其余的,我们并不都同意。或者至少,我们不应该在库级别强制执行它。“需要使用
new
expression创建指针”——不,不是。默认的删除程序需要这样做,但也可以使用其他删除程序。公平点。然而,
unique\u ptr
构造函数并不局限于OP提到的场景,因此我认为任何仅适用于该场景的原理都有一定的缺陷。因此,C++语言中没有办法避免这种别名指针@ @ WiTLIONT:否。您可以创建一个函数,它使用一个指针并返回一个RVAR引用到同一个指针。事实上,我们有一个;它被称为
std::move
。您始终可以将任何非右值表达式转换为右值表达式。@winterlight您可以设计自己的
unique\u ptr
类,该类只能通过
make\u unique
工厂函数创建(提示:使用私有构造函数和
friend
关键字来实现)。