You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,函数内允许用圆括号创建对象,和类成员的初始化规则不一样,这是你混淆的点所在。

修正方案

把类内的初始化改成以下两种合法形式之一:

  1. 等号初始化:std::shared_ptr<LibraryObject> m_library = nullptr;
  2. 花括号初始化:std::shared_ptr<LibraryObject> m_library{ nullptr };

或者也可以在类的构造函数初始化列表中完成初始化:

class Foo {
public:
    Foo() : m_library(nullptr) {}
private:
    std::shared_ptr<LibraryObject> m_library;
};

内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:25:56