我对字符串字面值的数据类型感到困惑。它是
const char *
还是 const char
?这是一个const char[N]
数组(和char const[N]
是同一件事),其中N
是字符串长度加上一个终止的NUL
字符长度(如果你定义“字符串长度”已经包括了NUL
,那么N
就是字符串长度)。
这就是为什么可以用 sizeof("hello") - 1
来获取字符串中字符的数量(包括任何嵌入的NUL
字符);如果它是指针,这个方法就行不通,因为它总是等于你系统指针的大小(减去1)。
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 - greggochar[]
。C++直到C++03 允许(但不推荐)将字符串字面量分配给非const char*
,尽管C++字符串字面量始终是const
的。从C++11开始,将字符串字面量分配给非const char*
将禁止,除非进行显式转换。 - DevSolarsizeof
确定数组大小的能力。 - DevSolar你好世界
"是const char[12]
(十一个字符加上'\0'
终止符)。
L"你好世界"
是const wchar_t[12]
。
自C++14起,"你好世界"s
是std::string
。
自C++17起,"你好世界"sv
是std::string_view
。
还要注意C++11添加的u8""
,u""
和U""
字符串字面量表示法,分别指定UTF-8,UTF-16和UTF-32编码。非限定字符串字面量(即""
和L""
)的编码是(并且一直是)实现定义的。
s
会使其成为std::string
类型吗?如果不是,为什么要使用它? - ajaysinghnegistring s = "abc";
,那么字符串字面量会隐式转换为字符串。如果是这样的话,为什么还要使用 ""s
呢? - ajaysinghnegistd::string
。这可能会在模板上下文中产生差异。 - DevSolar
const
限定符。C 将其视为char[N]
而不是const char[N]
。 - Praetorian