C++中字符串字面量的数据类型是什么?

26
我对字符串字面值的数据类型感到困惑。它是 const char * 还是 const char

12
从那些把它误认为是const char*的人的数量来看,我不明白为什么这个问题会被踩。显然当一半的回答者都不知道答案时,这个问题还是相当好的。 - WhozCraig
5
@CraigNelson,最近一段时间我见过太多声望值达到数万的人犯错了。 - chris
2
@Ken 在这方面,C 和 C++ 的唯一区别是 const 限定符。C 将其视为 char[N] 而不是 const char[N] - Praetorian
在C语言中,像"Hello"这样的字符串是一个指针,而且数组和指针也采用了算术运算。你可以在C语言中将"Hello"赋给一个指针。 - Ken
2
@Ken,这是证明它们在C中是数组的方法,使用Seth在C++中使用的相同方法:http://liveworkspace.org/code/198d050af0d08a9fc86ac17c144d581d。如果它是一个指针,大小很可能不是11。如果您想消除奇怪的指针大小,可以将具有不同长度的另一个放在第一个旁边。 - chris
显示剩余4条评论
2个回答

31

这是一个const char[N]数组(和char const[N]是同一件事),其中N是字符串长度加上一个终止的NUL字符长度(如果你定义“字符串长度”已经包括了NUL,那么N就是字符串长度)。

这就是为什么可以用 sizeof("hello") - 1 来获取字符串中字符的数量(包括任何嵌入的NUL字符);如果它是指针,这个方法就行不通,因为它总是等于你系统指针的大小(减去1)。


6
为了支持这个观点,一个窄字符串字面值的类型为“由n个const char组成的数组”,其中n是下面定义的字符串的大小,并具有静态存储期限(3.7)。 - chris
不会反驳。但是,当字符串常量用于模板匹配时,它似乎是char [N](而不是char const[N]),至少在一个用法中...上下文是:我有一个模板成员函数func(T const &x),实例化为A.func("string"),并且与T匹配为char [7]。奇怪。或者因为参数x是“指向const char [7]数组的const引用”,第二个const被视为冗余,并且第一个const不是T的一部分。g++ 4.6.3 - greggo
1
@greggo:C字符串字面量是char[]。C++直到C++03 允许(但不推荐)将字符串字面量分配给非const char*,尽管C++字符串字面量始终是const的。从C++11开始,将字符串字面量分配给非const char*禁止,除非进行显式转换。 - DevSolar
@DevSolar 谢谢,你让我记住了这个问题,只有一个问题,在 C 中字符串字面值可转换为 char * 吗? - Suraj Jain
1
@SurajJain:任何数组都可以“转换”为指向其第一个元素的指针。但是您失去了通过sizeof确定数组大小的能力。 - DevSolar

10
"

你好世界"是const char[12](十一个字符加上'\0'终止符)。

L"你好世界"const wchar_t[12]

自C++14起,"你好世界"sstd::string

自C++17起,"你好世界"svstd::string_view

还要注意C++11添加的u8""u""U""字符串字面量表示法,分别指定UTF-8,UTF-16和UTF-32编码。非限定字符串字面量(即""L"")的编码是(并且一直是)实现定义的。

"

只是一个新手问题:在字符串字面值后添加s会使其成为std::string类型吗?如果不是,为什么要使用它? - ajaysinghnegi
@AjaySinghNegi 确实 ""s 是一种使用 std::string 字面量 的方式。自 C++11 以来,您可以使用 用户定义字面量 - DevSolar
在 C++ 中,如果写成 string s = "abc";,那么字符串字面量会隐式转换为字符串。如果是这样的话,为什么还要使用 ""s 呢? - ajaysinghnegi
@AjaySinghNegi 有几个原因。其中一个是没有进行转换。字面值类型为std::string。这可能会在模板上下文中产生差异。 - DevSolar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接