为什么智能指针类型的成员变量不能在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() {}
};
当我想给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() {}
};