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中的对象缓冲区。