带大括号的char数组的非静态成员初始化在gcc中给出错误,而在clang中没有
Non-static member initialization of char array with brace gives an error in gcc while not in clang
考虑以下代码:
#include <iostream>
class A
{
char name[40] = { "Blank" }; // note the braces here
public:
const char *getName() { return name; }
};
int main()
{
A a;
std::cout << a.getName() << std::endl;
}
给出gcc
(最新版本5.2.0
)的错误:
prog.cpp:5:28: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
char name[40] = { "Blank" };
^
但clang
的情况不是这样,它与-std=c++11 -pedantic -Wall
完美地编译。
在这里用大括号表示非静态初始化项真的不正确吗?
问题:是否有大括号并不重要。例如,数组的定义,如:
char text[] = "some text";
等价于:
char text[] = { "some text" };
代码是有效的,并且现在被GCC主干接受。我认为它是由PR 65815修复的,括号省略在NSDMI
这个标准在我看来不是很清楚,但是我想说CLang是对的:
8.5.1说:
§2:当聚合由初始化列表初始化时,如8.5.4所述,初始化列表中的元素按下标递增或成员顺序作为聚合成员的初始化式。这是gcc的解释:name是一个数组,有一个大括号初始化列表,所以数组的第一个元素(一个char)用char数组初始化=> error
但是8.5.2明确地说:一个窄字符类型的数组…可以用窄字符串字面值初始化…或用大括号括起来的适当类型的字符串(强调我的)
我的解释是,标准认为字符数组足够特殊,即使它违反了8.5.1§2
来自c++标准工作草案n4527 [dcl.init]。初始化可以这样写:
初始化
initializer: brace-or-equal-initializer ( expression-list ) brace-or-equal-initializer: = initializer-clause braced-init-list initializer-clause: assignment-expression braced-init-list initializer-list: initializer-clause...opt initializer-list,initializer-clause...opt braced-init-list: {initializer-list,opt} { }
类成员声明
member-declarator: declarator virt-specifier-seq opt pure-specifier opt declarator brace-or-equal-initializer opt
从我读到的,似乎gcc不符合标准。因为使用大括号的类成员初始化被标准接受。
fwiw, g++
在基于括号的初始化和/或构造函数调用方面有几个问题,包括最近报告的一些问题。
然而(编辑),正如Jonathan正确指出的那样,大多数(所有?)这些都可以很容易地解决。我已经成功地将旧的括号语法替换为受影响的代码位。
听到这样的情况是有教育意义的,但幸运的是,我个人没有发现这样的情况,所以g++
对我来说仍然非常有用(注释解释了为什么我在某些奇怪的地方使用旧语法!)
- 分段错误当我试图运行程序时出错
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 制作时出错,C++"db.c:2127:错误:在"||"标记之前应使用";"
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 安装 mply 库时出错.致命错误:gsl/gsl_sf.h:没有这样的文件或目录
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 编译特征程序时出错:错误:'seq'不是'Eigen'的成员
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 为 freebsd 11 编译 gcc4.8.5 时出错: 错误: 未知类型名称 'choke'
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- 我同时使用了莱布尼茨和瓦利斯公式来估算π但输出数字错误,我不知道我哪里出错了
- 显示错误消息框时出错.我该如何显示它
- 使用 swig 时出错:输入 (1) 中的语法错误
- 编译类 C++ 中的线程时出错(错误 xthread)
- 在 Visual Studio 2015 社区中消除错误时出错