C++ 防止移动唯一的ptr C++;11

C++ 防止移动唯一的ptr C++;11,c++,c++11,move-semantics,unique-ptr,C++,C++11,Move Semantics,Unique Ptr,是否有任何方法可以防止用户明确地使用 std::move ?通过返回std::unique\u ptr,您已经放弃了对对象的控制。新的所有者要么销毁它,要么将它传递给其他人 如果不希望用户释放对象,则返回引用 您有boost::scoped_ptr/const std::unique_ptr(参见Jonathan的答案),它从技术上回答了您的问题--调用方释放,但我不能放弃资源——但我看不到一个令人信服的例子,说明为什么您需要这个,而不是std::unique\u ptr或一个参考使之成为c

是否有任何方法可以防止用户明确地使用

 std::move

通过返回
std::unique\u ptr
,您已经放弃了对对象的控制。新的所有者要么销毁它,要么将它传递给其他人

如果不希望用户释放对象,则返回引用


您有
boost::scoped_ptr
/
const std::unique_ptr
(参见Jonathan的答案),它从技术上回答了您的问题--调用方释放,但我不能放弃资源——但我看不到一个令人信服的例子,说明为什么您需要这个,而不是
std::unique\u ptr
或一个参考使之成为
const

unique\u ptr
move构造函数采用非常量值引用,因此不能使用
const
对象调用

const unique_ptr<int> owner(new int);
// ...
unique_ptr<int> thief = std::move(owner);  // ERROR
const unique\u ptr所有者(新整数);
// ...
唯一的小偷=标准::移动(所有者);//错误

这使得
unique\u ptr
可以像
boost::scoped\u ptr

一样使用。也许您可以通过常量引用传递它。您到底想做什么?用户如何访问
unique\u ptr
?@DarioOO如果您不想让用户拥有任何所有权,请返回一个原始指针。@DarioOO:Er,当您在
unique\u ptr
中返回时,根据定义,您赋予了它唯一的所有权。否则是谁拥有它?@DarioOO如果你不想放弃所有权,如果保证不为空,则通过引用返回;如果可能为空,则通过原始指针返回(出于文档目的,我上面给出的链接是一个“智能”指针的建议,该指针明确不拥有其指针对象,但它不在标准中)…一旦返回
unique\u ptr
,您就已经放弃了所有权,不管指针是否再次移动,因此,阻止std::move对您没有帮助这一点很好,但我怀疑OP想要的是根本不给调用者所有权,而不仅仅是防止调用者再次移动(“我返回一个唯一的指针,我希望用户能够调用该指针的方法而不获取其所有权。”)--他可能需要通过引用而不是通过引用来返回。我没有看到这样的评论——是的,仅仅返回引用就更有意义了。难道小偷就不能扔掉const吗?;)@FredOverflow也可以直接调用
.get()
,不?@FredOverflow,是的,安全从来都不是黑白的,这只会阻止偶然的、机会主义的小偷,而不会阻止有动机的暴徒使用
const_cast
:o)或我喜欢说的武器,你可以让你很难不小心误用一个接口,但是你的代码永远不会安全,因为你的代码会被那些有足够动机的白痴破坏!对我来说,问题是允许扩展一个类而不给类外资源。引用不好,因为资源是通过DI和负责资源生存期的类注入的。同时,绑定类和资源的别名构造函数毫无意义,因为不可能在类之外使用资源。上下文是OpenGL中的对象缓冲区。