Grz*_*ski 11 c++ language-lawyer c++11
考虑以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
它在gcc(最新版本5.2.0)中出错:
prog.cpp:5:28: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
char name[40] = { "Blank" };
^
Run Code Online (Sandbox Code Playgroud)
但情况并非如此clang,它可以完美地编译它-std=c++11 -pedantic -Wall.
在这里为非静态初始化程序添加大括号是否真的不正确?
AFAIR是否存在牙箍并不重要.例如,数组的定义,例如:
char text[] = "some text";
Run Code Online (Sandbox Code Playgroud)
相当于:
char text[] = { "some text" };
Run Code Online (Sandbox Code Playgroud)
那么标准在我看来并不是很清楚,但我会说CLang是对的:
8.5.1说:
§2:当初始化列表初始化聚合时,如8.5.4中所述,初始化列表的元素被视为聚合成员的初始化者,增加下标或成员顺序.那是gcc解释:name是一个数组,有一个brace-init-list所以数组的第一个元素(一个char)用char array => error初始化
但8.5.2明确地说:一个窄字符类型的数组...可以用一个窄字符串文字初始化...... 或者用括号括起来的适当类型的字符串文字(强调我的)
我的解释是标准考虑char数组特别足以明确地允许括在括号中的字符串文字有效,即使它失败8.5.1§2