6

让我们考虑以下来自 C++11 标准(准确地说是 N3376 草案)的引用:

(2.14.8.5)

如果 L 是用户定义的字符串文字,则令 str 为不带 ud-suffix 的文字,令 len 为 str 中的代码单元数(即,其长度不包括终止空字符)。文字 L 被视为形式的调用

     operator "" X (str , len )

而对于所有其他类型的用户定义文字(浮点、整数、字符),即使文字本身作为字符串传递,长度也永远不会传递。例如:

42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2)

为什么字符串和非字符串用户定义文字之间存在这种区别?或者我应该说,为什么实现为 UD 字符串文字传递 len?与其他文字的情况一样,长度可以通过空终止来推断。我错过了什么?

4

2 回答 2

8

对于字符串文字,可以合理地想象空字符嵌入到字符串的序列中,例如"a\0b". 为了允许实现消耗整个字符串文字,即使有嵌入的空字符,它也需要知道文字的长度。用户定义文字的其他形式不能包含嵌入的零字符。

于 2012-10-28T20:06:05.993 回答
6

字符串在 C/C++ 中总是以 null 结尾,但这绝不意味着它们不能包含嵌入的\0字符,你可能有"1234\05678",虽然这个字符串以 null 结尾,但它包含一个额外的 '\0'。

于 2012-10-28T20:06:25.777 回答