初始化字符串时,额外的卷曲牙套

Extra curly braces while initializing a string

本文关键字:字符串 初始化      更新时间:2023-10-16

根据问题,字符串array [] =; quot; quot;;意思是为什么它起作用?我想问以下代码中的 s1 s2 之间有什么区别:

int main() {
    const char* s1 = { "Hello" }; // strange but work as followed
    const char* s2 = "Hello"; // ordinary case 
    return 0;
}

为什么允许额外的卷发?对C 标准的任何引用都将是有用的。

在C 98(和C 03)中,这很简单;在第8.5条中:

14-如果T是标量类型,则声明表单 T x = { a }; 等同于 T x = a;

在C 11中,这是由列表限制(8.5.4p3)涵盖的:

[...]如果初始化器列表具有E类型的单个元素,并且t不是参考类型或 它的引用类型与e有关,对象或参考是从该元素初始化的[...]

初始化的。

i think 这与用牙套初始化标量相同。

简单的答案是:因为标准是这样说的。§8.5.2/1:

一个char阵列(无论是普通的char,签名的char还是未签名) char),char16_t阵列,char32_t阵列或wchar_t数组可以 用狭窄的字符字面char16_t初始化 字符串文字,char32_t字符串文字或宽字符串 文字分别是或通过适当的字符串 括号中的文字。连续角色 字符串的值字面初始化 阵列。

(那是C 11,但更早的版本说同样的话,负对新类型的引用。)

允许的原因是因为C允许它。至于原因C允许,我不知道。