MSVC2017中std::shared_ptr用nullptr初始化报C2059错误的原因
报错原因解析
核心问题出在类成员变量的初始化语法上:在C标准中,类的成员变量声明位置不允许直接使用圆括号(
())进行初始化——哪怕是C11及以后的版本,类内成员初始化也仅支持等号初始化或花括号初始化两种形式。你写的
std::shared_ptr<LibraryObject> m_library( nullptr );属于在类成员声明中用圆括号初始化,这违反了语法规则,所以MSVC2017抛出error C2059: syntax error: 'nullptr'。而原始指针LibraryObject *m_library;只是单纯的变量声明(未初始化),因此编译器不会报错。微软文档里的示例1是在函数作用域内初始化shared_ptr,函数内允许用圆括号创建对象,和类成员的初始化规则不一样,这是你混淆的点所在。
修正方案
把类内的初始化改成以下两种合法形式之一:
- 等号初始化:
std::shared_ptr<LibraryObject> m_library = nullptr; - 花括号初始化:
std::shared_ptr<LibraryObject> m_library{ nullptr };
或者也可以在类的构造函数初始化列表中完成初始化:
class Foo { public: Foo() : m_library(nullptr) {} private: std::shared_ptr<LibraryObject> m_library; };
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

