让我们考虑一下C ++ 11标准中的以下引用(准确地说是the N3376 draft):
(2.14.8.5)
如果L是用户定义的字符串文字,那么让str成为没有文字的文字 它的ud-su ffi x和len是str中代码单元的数量(即它的代码单元) 不包括终止空字符的长度)。文字L是 作为表格的调用处理
operator "" X (str , len )
对于所有其他类型的用户定义文字(浮点,整数,字符),即使文本本身作为字符串传递,也不会传递长度。例如:
42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2)
为什么字符串和非字符串用户定义的文字有区别?或者我应该说,为什么实现为UD字符串文字传递len?与其他文字一样,长度可以通过空终止来推断。我错过了什么?
答案 0 :(得分:8)
对于字符串文字,可以合理地设想在字符串的序列中嵌入空字符,例如"a\0b"
。要允许实现使用整个字符串文字,即使存在嵌入的空字符,也需要知道文字的长度。用户定义的文字的其他形式不能包含嵌入的零字符。
答案 1 :(得分:6)
字符串在C / C ++中始终以null结尾,但它绝不意味着它们不能包含嵌入的\0
字符,您可能有"1234\05678"
并且当此字符串为空终止时,它包含一个额外的'\ 0`在里面。