是否存在约束使用shared_ptr :: reset的惯用方法

时间:2017-11-06 01:14:54

标签: c++ shared-ptr

如果对我的代码中没有出现对shared_ptr::reset的调用以获取特定的引用计数对象,那么如果可以在编译时将其显式化并可强制执行,那将会很好。

有没有一种标准方法可以做到这一点?

澄清:如果shared_ptr本身私下调用reset,则可以。我只是想确保我不在我的代码中调用它。

更新:@Brian实际上在评论中回答了这个问题。 const auto p = make_shared...解决了我所声明的问题,如果他们复制了他们的问题。我从来没有看到有人宣布shared_ptr为const,因此不知何故我没想过。

1 个答案:

答案 0 :(得分:1)

您不能强行阻止某人调用类的特定公共接口函数。这就是为什么它是 public 界面。

目前尚不清楚你的意思:

  

shared_ptr::reset的调用没有出现在我的代码中,用于特定的引用计数对象

令人困惑的部分是“特定参考计数对象”的含义。您可能正在谈论shared_ptr<T>的特定实例对象。在这种情况下,如果您想阻止某人重置该特定实例,您可以将其声明为const对象。这也会阻止复制/移动分配,这可能会产生相同的效果。

如果“特定引用计数对象”引用指针所持有的T而不是shared_ptr<T>,则不起作用。有人可以使用const对象并将其轻松复制到非const对象。他们将无法重置const指针,但他们仍然可以重置指向T的指针。

如果shared_ptr<T>::reset冒犯了你,你可以从shared_ptr派生(私下)一个新类,然后继承你想要的接口,reset除外。然后使用派生类而不是实际的shared_ptr

当然,您还需要摆脱复制/移动赋值运算符,因为它们可以用于与reset具有相同的效果。如果你有这样的non_rebindable_shared_ptr,那么它不应该有一个默认的构造函数,因为创建一个空构造函数是没用的。