C++ C++;20个指定的初始值设定项字符[]

C++ C++;20个指定的初始值设定项字符[],c++,initialization,language-lawyer,c++20,designated-initializer,C++,Initialization,Language Lawyer,C++20,Designated Initializer,。我试图用新语法初始化结构中的字符数组 : 我发现这种行为是bazzar,char str[12]=“你好”行工作正常。但是相同的初始化表单在指定的初始化器列表中不起作用 问题: 为什么我不能用字符串文本初始化char数组 编辑 我以前使用的是GCC。 GCC是否有解决方法?clang或GCC是否正确?我想说,您不能以这种方式初始化它,因为它们不兼容类型。如果从严格的角度来看。。。或“迂腐”程度;) 字符数组不等于std::string,即使它们密切相关。为了类型安全,编译器不允许这样的赋值。

。我试图用新语法初始化结构中的字符数组

:

我发现这种行为是bazzar,
char str[12]=“你好”行工作正常。但是相同的初始化表单在指定的初始化器列表中不起作用

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

编辑

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

我想说,您不能以这种方式初始化它,因为它们不兼容类型。如果从严格的角度来看。。。或“迂腐”程度;)

字符数组不等于std::string,即使它们密切相关。为了类型安全,编译器不允许这样的赋值。
甚至,正如极客对极客的解释

我在这里看不到任何荒谬的东西。。。也许我忽略了什么

您发布的规范在底部的“注释”部分中说明:

在C语言中,大小小于字符串文字大小1的字符数组可以从字符串文字初始化;结果数组不是以null结尾的。这在C++中是不允许的。
我认为这就是原因。但我同意,这有点“隐藏”。指定的初始值设定者是。指示符名称的唯一用途是决定从给定的大括号或相等初始值设定项初始化哪个聚合成员。指定初始化的使用不会改变初始化的具体形式,因此也不会改变它是否有效

给定您的
Test
对象,
Test{100u,“hello”}
Test{.v=100u,.b=“hello”}
要么都有效,要么都无效。在这两种情况下,
Test::b
都是根据以下条件初始化的:

否则,将从相应的初始值设定项子句复制初始化元素,或使用相应指定初始值设定项子句的大括号或相等初始值设定项初始化元素

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

这样你的工作就可以了。这是一个编译器错误


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

。。。所以GCC拒绝测试测试{.v=100u,.b=“hello”}但在非学究模式下接受
测试测试{.v=100u,{.b=“hello”},这显然是无稽之谈。有趣的是,听起来像是编译器的bug。。。谢谢相关链接!谢谢但我不是在谈论std::string,而是讨论char数组。我相信引号只是指初始化带有字符串文字的数组,这些字符串文字会由于初始化而删除空字符。因此,当空值将被丢弃时,C++不允许初始化字符数组。我提到STD:String是因为您使用的字符串文字用于初始化,并且怀疑类型不匹配,因为GCC可以将CHAR[]和“hello”解释为类型,因此,ANS防止初始化。但这实际上与您发布的C++20规范相矛盾。。。我不知所措,实际上我的帖子被删除了。Idk为什么它仍然会弹出。不过,谢谢你的客气话和解释。我希望我是错的,可以继续这样做。我已经投了赞成票,但可能有人有一个有趣的语法问题,所以我会推迟选择你的答案:)
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;
}