有条件地使初始化列表中的 shared_ptr 为 null

Conditionally make shared_ptr in initializer list null

我处于需要制作 shared_ptr null 或包含 class Bar 实例的情况。

下面的方法不起作用,因为 Barnullptr 不是同一类型。怎样才能做到这一点?

 class Bar {};

 class Foo {

    private:
       shared_ptr<Bar> b;

    public:
       Foo() : b(true ? Bar() : nullptr) {
       }

 };

b(true ? std::make_shared<Bar>() : nullptr)

您可以使用

Foo() : b(true ? std::make_shared<Bar>() : nullptr) {}

我的建议是将该逻辑推送到辅助函数。

class Foo {

   private:
      std::shared_ptr<Bar> b;

      static std::shared_ptr<Bar> getB(bool flag)
      {
         return (flag ? std::make_shared<Bar>() : nullptr);
      }

   public:
      Foo() : b(getB(true)) {}

};

你的问题是你对b的初始化不正确。

b(Bar())

也不会编译。你需要

b(new Bar())

和三元运算符的等价物:

b(true?new Bar():nullptr)

很好。但是,我建议尽可能避免裸露 new,并使用

b(true?maked_shared<Bar>():nullptr)

尽管 make_shared returns 是与 nullptr 不同的类型,但可以通过从 nullptr 构造空的 shared_ptr 将它们强制转换为同一类型