用户定义的字符串文字比.其他用户定义的文字

Arm*_*yan 6 c++ user-defined-literals c++11

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

(2.14.8.5)

如果L是用户定义的字符串文字,则让str为没有ud-su ffi x的文字,并且len为str中的代码单元数(即,其长度不包括终止空字符).文字L被视为表格的调用

     operator "" X (str , len )
Run Code Online (Sandbox Code Playgroud)

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

42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2)
Run Code Online (Sandbox Code Playgroud)

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

Die*_*ühl 8

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


Big*_*oss 6

字符串在C/C++中总是以空值终止,但它绝不意味着它们不能包含嵌入\0字符,您可能有,"1234\05678"并且当此字符串为空终止时,它包含一个额外的'\ 0`.