为什么智能指针类型的成员变量不能在class的声明处初始化?

Why smart pointer type member variable can't be initialized at the declaring place in a class?

当我想给class添加一个智能指针类型的成员变量时,发现在声明的地方无法初始化:

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr = new int;  // not ok
  Foo() {}
};

但我可以做到:

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr;  // ok
  int* intPtr = new int; // ok
  Foo() {
    intSharedPtr.reset(new int);
  }
};

看起来智能指针与普通指针有很大不同,为什么会这样?

std::shared_ptr不能将copy-initialized from raw pointer, the conversion constructor标记为explicit

您可以使用 direct-initialization:

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr {new int};
  Foo() {}
};

或从 std::shared_ptr:

初始化
class Foo {
 public:
  std::shared_ptr<int> intSharedPtr = std::shared_ptr<int>(new int);
  Foo() {}
};

最好使用 std::make_shared:

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr = std::make_shared<int>();
  Foo() {}
};