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

Zha*_*eng 4 c++ initialization class smart-pointers copy-initialization

当我想向类添加智能指针类型的成员变量时,我发现它无法在声明处初始化:

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

但我可以这样做:

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

看来智能指针与普通指针有很大不同,为什么会出现这种情况呢?

son*_*yao 10

std::shared_ptr无法从原始指针复制初始化,转换构造函数被标记为explicit.

您可以使用直接初始化

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr {new int};
  Foo() {}
};
Run Code Online (Sandbox Code Playgroud)

或者从以下位置初始化std::shared_ptr

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr = std::shared_ptr<int>(new int);
  Foo() {}
};
Run Code Online (Sandbox Code Playgroud)

并且更好地使用std::make_shared

class Foo {
 public:
  std::shared_ptr<int> intSharedPtr = std::make_shared<int>();
  Foo() {}
};
Run Code Online (Sandbox Code Playgroud)