【问题标题】:Is there a way to automatically initialize a std::shared_ptr to hold a valid object?有没有办法自动初始化 std::shared_ptr 以保存有效对象?
【发布时间】:2018-05-11 07:50:06
【问题描述】:

当我写作时

std::shared_ptr<MyType> x;

x 使用指向 nullptr 的空共享指针进行初始化。但我希望它自动调用 MyType 的默认值(或其他一些指定的构造函数)。我知道,我可以写:

std::shared_ptr<MyType> x = std::maked_shared<MyTYpe>();

但有时人们会忘记然后你会遇到麻烦,所以由编译器强制执行会很好。

【问题讨论】:

  • 这就像要求int *p; 自动分配一个整数。不确定这是个好主意。
  • 没有。您必须创建自己的共享指针类,可能将其称为 never_null_shared_ptr,并可能使用底层 std::shared_ptr 来实现。
  • 再想一想:你要求让shared_ptr 的行为不像shared_ptr。这显然是不可能的。当T 是您的特殊类型时,它会破坏使用shared_ptr&lt;T&gt; 的有效模板代码,它假定shared_ptr 的行为符合标准中的规定。
  • @YSC 这可能编译但值得解决的是,就标准 C++ 而言,它具有未定义的行为。
  • 如果智能指针永远不应该有一个空值,你为什么首先使用智能指针?你不能使用引用(或只是对象本身)吗?

标签: c++ constructor std shared-ptr


【解决方案1】:

您可以创建一个类,例如:

template <typename T>
struct defaulted_shared_ptr : std::shared_ptr<T>
{
    using std::shared_ptr<T>::shared_ptr;
    defaulted_shared_ptr() : std::shared_ptr<T>(std::make_shared<T>()) {}
};

然后

defaulted_shared_ptr<Foo> foo;

将包含一个默认构造的Foo

Demo

【讨论】:

  • 您能否详细说明这一行使用 std::shared_ptr::shared_ptr;
  • 允许使用shared_ptr的构造函数,所以你可以使用defaulted_shared_ptr&lt;Foo&gt; foo(new Foo(42))。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多