C和C ++中string文字的types是什么?

C中string的types是什么? 是char *还是const char *或者const char * const

那么C ++呢?

在C中,string文字的types是char[] – 根据types它不是const ,但是它是不确定的行为来修改内容。 此外,具有相同内容(或足够相同内容)的2个不同string文字可能共享或不共享相同的数组元素。

从C99标准6.4.5 / 5“string文字 – 语义”:

在翻译阶段7,一个字节或值为零的代码被附加到每个多字节字符序列,这是由一个或多个string产生的。 然后使用多字节字符序列来初始化静态存储持续时间和长度的数组,以便足以包含该序列。 对于string文字,数组元素的types为char ,并且用多字节字符序列的单个字节进行初始化; 对于宽string文字,数组元素的types为wchar_t ,并用宽字符序列初始化…

没有说明这些数组是否是不同的,只要它们的元素具有适当的值。 如果程序试图修改这样一个数组,行为是不确定的。

在C ++中,“一个普通的string常量的types是'n const char '的数组(从2.13.4 / 1”string文字“)。 但是在C ++标准中有一个特例,它使得指向string的指针可以很容易地转换为非const指针指针(4.2 / 2“数组到指针的转换”):

不是宽string文字的string文字(2.13.4)可以转换为“指向char的指针”types的右值。 一个宽string文字可以被转换为“指向wchar_t的指针”types的右值。

作为一个方面说明 – 因为C / C ++中的数组很容易转换为指针,string常常可以用在指针上下文中,就像C / C ++中的任何数组一样。


额外的编辑:接下来的事情大部分都是关于C和C ++标准在stringtypes上做出select的理由。 所以,要一粒盐(但请注明,如果你有更正或额外的细节):

我认为C标准select了string字面非常量types,因为有这么多的代码,希望能够使用指向文字的非const限定的char指针。 当const限定符被添加时(如果我没有弄错的话是在ANSI标准化时间周围完成的,但是在K&R C周围积累了大量的现有代码之后很久),如果它们指向了string文本只能被赋值char const*types而不用强制转换几乎所有的程序都需要改变。 不是一个好的方法来获得一个标准的接受…

我相信改变C ++的string文字是const限定的,主要是为了支持允许一个string更适当地匹配一个带有“ char const* ”参数的重载。 我认为还有一个愿望是封闭types系统中的一个洞,但这个洞在很大程度上是由数组到指针转换的特殊情况打开的。

该标准的附录D指出“从string常量到非常量限制的隐式转换(4.2)已被弃用”,但是我认为这么多的代码仍然会被破坏,以至于编译器实现者或者标准委员会愿意真正拉下插头(除非可以devise出一些其他聪明的技巧 – 但是那么这个洞就会回来,不是吗?)。

ACstring文字的types为char [n] ,其中n等于字符数+ 1以说明string末尾的隐式零。

该数组将被静态分配; 它不是const ,但修改它是未定义的行为。

如果它有指针typeschar *或不完整typeschar [] ,则sizeof不能按预期工作。

编写string常量是一个C ++习惯用法,不是任何C标准的一部分。

他们以前是char[]types的。 现在它们的types是const char[]

由于各种历史原因,string文字总是在C中键入char[]

早期(在C90中),有人说,修改string文字调用未定义的行为。

他们并没有禁止这种修改,也没有使string文字const char[]更有意义。 这是为了与旧代码向后兼容的原因。 一些旧的操作系统(最着名的DOS)并没有抗议,如果你修改string文字,所以有很多这样的代码。

C现在仍然有这个缺陷,即使在最近的C标准中也是如此。

C ++从Cinheritance了同样的缺陷,但在后来的C ++标准中,他们终于使string文字为const (在C ++ 03中被标记为废弃,最终在C ++ 11中被固定)。