初始化字符串时,额外的卷曲牙套
Extra curly braces while initializing a string
根据问题,字符串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允许,我不知道。
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 用字符串初始化我的类的对象
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 使用字符串初始化wchar_t[]
- 如何从常量字符串初始化 LPWSTR?
- 字符串初始化和打印
- 这是什么字符串初始化?
- 字符串初始化失败:"expression must have integral or unscoped enum type"
- 谁能告诉我如何用字符串初始化 ex 对象
- 函数原型中的字符串初始化
- 带双引号的字符串初始化
- C 字符串初始化会导致意外放置空字符
- 字符串初始化失败
- 将字符存储在用字符串初始化的字符指针中
- 为什么使用字符串初始化的C++位集是相反的
- 用c++中的字符串初始化char Buffer
- 带bool类型的字符串初始化
- c++字符串初始化
- 视觉 任何非(字符*)正确的方法,用于从 C++ 中的常量字符串初始化 void*