C++数组初始化警告

3

我在一个类中声明并初始化了一个常量字符数组:

class grid {
    const char test[11] = {'s', 'e', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

我的代码可以工作,但我一直收到编译器警告:

非静态数据成员初始化仅在C++11中可用

扩展的初始化列表仅在C++11中可用

我知道这不是一个问题,因为我正在编译为C++11标准,但我想知道我的代码中哪些部分是C++11之前的。

我希望有人能给我一些见解,并建议我如何使这段代码符合C++98的要求。

另外,按照要求,我的编译器命令:

> g++ -o test main.cpp

2
你在编译器命令行中添加了“-std=c++11”吗? - Praetorian
1
警告中默认启用 - ggle
1
要让C++98“友好”,不要在类声明中初始化类数据成员;而是应该在类构造函数中进行初始化。 - djikay
3
"Enabled by default" 意思是警告默认启用,与 -std=c++11 无关。如果您已启用 C++11 模式,则不应出现此警告。C++03 仅允许在类内初始化常量整数静态数据成员。您正在使用 C++11 功能称为非静态数据成员初始化器。 - Praetorian
3
在C++98中,你不能在构造函数中初始化数组,除非你把给数组元素赋值视为初始化。 - chris
显示剩余3条评论
2个回答

2
您需要使用-std=c++11(对于gccclang)进行编译。如果不这样做,您的程序将会与旧的C++98标准进行兼容性检查。
因此,它允许您在没有标志的情况下使用C++11功能,但会警告您,以防您意外地这样做。
进一步解释:
您的代码可以编译通过,因为它是合法的代码,编译器可以编译它。编译器省略了警告,以使您“意识到”您使用了C++11功能,因为许多人(像我的大学一样)仍然使用过时的编译器,如gcc4.6,它们尚未完全支持C++11。这意味着这些人可能无法编译您的代码,这可能会对您产生影响(例如,如果您的教授需要编译您的作业)。
使用-std=c++11标志告诉编译器:“这是一个C++11程序,应使用符合C++11标准的编译器进行编译”。因此,警告变得多余。

就问题而言,我知道使用c++11编译可以解决这个问题。但我更感兴趣的是它为什么会发生以及如何解决。 - ggle
1
@Rhys 已编辑,希望这有所帮助。 - Baum mit Augen

2
为了让其兼容C++98,你需要在类声明之外初始化非静态类常量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接