6

C++11 標準 (正確には N3376 ドラフト)からの次の引用を考えてみましょう。

(2.14.8.5)

L がユーザー定義の文字列リテラルの場合、str を ud-sufx を除いたリテラルとし、len を str 内のコード単位の数 (つまり、終端の null 文字を除いた長さ) とします。リテラル L は、次の形式の呼び出しとして扱われます。

     operator "" X (str , len )

一方、他のすべてのタイプのユーザー定義リテラル (浮動小数点、整数、文字) では、リテラル自体が文字列として渡されたとしても、長さは渡されません。例えば:

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

文字列と非文字列のユーザー定義リテラルの間にこのような違いがあるのはなぜですか? それとも、実装が UD 文字列リテラルの len を渡すのはなぜですか? 長さは、他のリテラルの場合と同様に、ヌル終了によって推測できます。私は何が欠けていますか?

4

2 に答える 2

8

文字列リテラルの場合、null 文字が文字列のシーケンスに埋め込まれていることが合理的に考えられます"a\0b"。ヌル文字が埋め込まれていても、実装が文字列リテラル全体を消費できるようにするには、リテラルの長さを知る必要があります。ユーザー定義リテラルのその他の形式には、ゼロ文字を埋め込むことはできません。

于 2012-10-28T20:06:05.993 に答える
6

C/C++ では、文字列は常に null で終了し\0ますが、埋め込み文字を含めることができないという意味ではありません。"1234\05678"

于 2012-10-28T20:06:25.777 に答える