为什么包含字符串文字的初始化器对初始化“char”数组有效
Why is an initialiser containing a string literal valid to initialise a `char` array?
事实证明,char c[] = {"a"};
在C++03和C++11中都是完全有效的。
我不希望它是,因为它是一个char
数组而不是char const*
,我希望大括号初始化器需要其每个"项目"的兼容类型。它有一个项目,那就是char const*
而不是char
。
那么,是什么使此初始化有效呢?这样做有理由吗?
类似地,char c[] = {"aa"};
编译,打印c
结果为输出"aa
"。
当然,我希望char c[]{"a"}
在 C++11 中有效,但这不一样!同样,char c[] = {'a'}
在两者中都很明显,char c[] = "a"
也是如此。
虽然它可能不一定是直观的,但它只是被允许的;在这两个标准中都有一个不同的规则:
[2003: 8.5.2/1]:
char
数组(无论是纯char
、signed char
还是unsigned char
( 可以通过字符串文本(可选(初始化 用大括号括起来(;wchar_t
数组可以通过宽 字符串文字(可选地括在大括号中(;连续字符 的字符串文本初始化数组的成员。[..]
[n3290: 8.5.2/1]:
字符数组(无论是plain char
、signed char
还是unsigned char
(、char16_t
数组、char32_t
数组或wchar_t
数组可以 由窄字符文本初始化,char16_t
字符串文本, 分别char32_t
字符串文本或宽字符串文本,或按 括在大括号中的适当类型的字符串文本。连续 字符串文本值的字符初始化元素 的数组。
不过,我无法解释为什么委员会会这样做。
量类型也可以使用大括号初始化(就像结构和数组一样(。
struct S { int x, char c };
S s = {5, 'a'};
int arr[] = {5, 6, 7};
/* (my guess) out of consistency */
int z = { 4 };
并且由于字符串文字可以分配给字符数组和指针
char arr[] = "literal";
char* ptr = "another";
允许char arr[] = { "literal" };
似乎也很合适。
我想是为了C兼容性吗?实际上,T x = { value of T };
也适用于其他类型的T。在C99标准中,
6.7.8/11:标量的初始值设定项应为单个表达式,可以选择括在大括号中。
6.7.8/14:字符类型的数组可以通过字符串文本初始化,可以选择括在大括号中。
6.7.8/15:元素类型与
wchar_t
兼容的数组可以通过宽字符串文本初始化,可以选择用大括号括起来。
我不知道为什么C会有这个。
- 使用指针初始化 char 数组或字符串 C++
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- c ++ 如何在构造函数中初始化 char
- 用字节初始化 char* 和 std::字符串
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 初始化char数组和具有整数文字的char时的差异
- 使用表达式初始化char*无效
- 在类构造函数中初始化 Char 数组成员C++
- 在C 中的构造函数的初始化列表中初始化char数组
- 在C 中,这是用字符串文字初始化char数组的好习惯
- 值类型 const char 不能用于初始化 char* 类型的实体
- 如何初始化 char*[] 数组
- char的值不能用于初始化char*的实体
- 如何在c中重新初始化char*变量
- 如何在c++类中初始化char*?(sizeof()总是给出8)
- 通过传递的指针段错误初始化 char 数组
- 如何在构造函数中初始化 char 数组
- 初始化char数组以容纳非null终止的字符串
- char*类型的值不能用于初始化“char”类型的实体
- 用c++中的字符串初始化char Buffer