C++20 introduces designated initialisers。我正在尝试使用新语法在结构内初始化字符数组。

Pretty simple problem, I think code may explain it best:

struct Test
{
    unsigned v;
    char b[12];
};

int main()
{
    char str[12] = "hello"; // Works.
    char strb[12]{"hello"}; // Works.
    //
    Test testa
    {
        .v = 100u,
        .b = "hello" //Doesn't work...
    };
    Test testb
    {
        .v = 100u,
        .b = { "hello" } //Doesn't work...
    };
    Test testc
    {
        .v{ 100u },
        .b{ "hello" } //Doesn't work...
    };
    Test testd
    {
        .v{ 100u },
        .b{ "hello" } //Doesn't work...
    };
    Test teste
    {
        .v = 100u,
        .b = {} //This works.
    };
    Test testf
    {
        .v = 100u,
        .b = {'h', 'e', 'l', 'l', 'o', '\0'} //This works.
    };
    return 0;
}

我发现这种行为令人眼花,乱,char str[12] = "hello";行工作正常。但是,相同的初始化形式在指定的初始化程序列表中不起作用。

问题:
为什么不能用字符串文字初始化char数组?

编辑

我以前使用的是GCC。
This works with clang. GCC有解决方法吗?clang或GCC是否正确?

最佳答案

指定的初始化程序是aggregate initialization的一个较小变体。指示符名称的唯一用途是从给定的花括号或相等的初始值设定项中确定要初始化哪个聚合成员。使用指定的初始化不会改变初始化的具体形式,因此,它是否有效。

给定您的Test对象,Test{100u, "hello"}Test{.v = 100u, .b = "hello"}均有效或均无效。在这两种情况下,Test::b都会根据[dcl.init.aggr]4.2进行初始化:



复制初始化与完全初始化数组变量的过程完全相同。这是完全有效的。

因此,您应该可以工作。这是一个编译器错误。

GCC的“解决方法”是等待错误被修复。或者返回标准聚合初始化,直到修复其编译器为止。

关于c++ - C++ 20指定的初始化程序char [],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61092316/

10-10 01:01
查看更多