带有大括号的char数组的非静态成员初始化在gcc中给出错误,而不是在clang中

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)

Jon*_*ely 8

代码有效,现在被GCC中继接受.我认为它是由PR 65815修复的,而且在NSDMI中不能使用


Ser*_*sta 5

那么标准在我看来并不是很清楚,但我会说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