【问题标题】:Warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11? [duplicate]警告:非静态数据成员初始化器仅适用于 -std=c++11 或 -std=gnu++11? [复制]
【发布时间】:2026-02-10 12:50:01
【问题描述】:

我有这个代码

class Move
{
    public:
        Move()
        {
            name = "";
            type_num = 18;
            power = 0;
            accuracy = 0;
            type = "???";
        }

        Move(string a, int b, int c, int d)
        {
            name = a;
            type_num = b;
            power = c;
            accuracy = d;
            /*lines of code to give type a string variable depending on the value of type_num*/
        }

    private:
        string name, type;
        int type_num, power, accuracy;
};

class Moveset
{
    public:
        Moveset()
        {
        }               
    private:
        Move slot1{"MOVE 1", rand() % 18, 10*(rand() % 15 + 1), 5 * (rand() % 11 + 10)};
};

编译器给了我这个警告,用于在 Moveset 类的私有部分下声明对象 slot1。

464 83  C:\Users\N\Desktop\C++\Poke\Poke.cpp    [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11
464 15  C:\Users\N\Desktop\C++\Poke\Poke.cpp    [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
464 83  C:\Users\N\Desktop\C++\Poke\Poke.cpp    [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11

虽然它给了我警告,但显然它并没有影响程序运行。它实际上会影响什么吗?我在这里做错了什么?

编辑:静态成员初始化器和非静态成员初始化器有什么区别?

【问题讨论】:

标签: c++ class object c++11


【解决方案1】:

你问:

编辑:静态成员初始化器和非静态成员初始化器有什么区别?

差别不大。
初始化 static 成员的初始化程序是静态成员初始化程序。
初始化非static 成员的初始化程序是非静态成员初始化程序。

class foo
{    
    static int var2 = 20;  // static member initializer
    int var1 = 10;         // non-static member initializer
};

【讨论】:

  • 静态/非静态成员有什么区别?
  • static 成员未绑定到类的特定实例。有关详细信息,请参阅en.cppreference.com/w/cpp/language/static
  • 有人愿意这样做吗?
  • static 数据成员的用例太多。一个简单的例子:如果你想在日志文件或用户消息中有一个代表类名的字符串,你可以定义一个static 成员。如果您有一个类Foo,您很可能会使用字符串"Foo" 作为类名。对于类的所有实例,该名称应保持相同。
【解决方案2】:

编译器可能允许它作为扩展,但在旧的 C++ 标准中确实不允许。

要么通过构造函数初始化器列表初始化对象,要么使用编译器告诉您的标志启用 C++11。


使用构造函数初始化列表的示例:

class Moveset
{
public:
    Moveset()
        : slot1{"MOVE 1", rand() % 18, 10*(rand() % 15 + 1), 5 * (rand() % 11 + 10)}
    {
    }
private:
    Move slot1;
};

您似乎正在使用某种IDE,所以我不知道如何添加标志,但通常在项目设置的某个地方有一个编译器及其设置的选项卡,您应该在哪里能够添加标志(如果还没有 C++11 的复选框),只需在此处添加 -std=c++11

【讨论】:

  • 你能给我一个例子来说明如何做到这一点吗?我是 C++ 新手(几乎是编程),即正确的方法
  • @nayfaan 更新了我的答案
  • 如果我想在声明的时候传入变量怎么办?