2012-10-28 21 views
6

のは、C++ 11標準(the N3376 draft、正確には)から、以下の引用文を考えてみましょう:Lは、ユーザーデFi回線ned-ある場合ユーザー定義の文字列リテラル対。他のユーザー定義リテラル

(2.14.8.5)

文字列リテラルの場合、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

おそらくエンコード/文字セットと関係があります。その前の他の段落はすべて "[注:シーケンスc1c2 ... ckは基本的なソースキャラクタセットの文字のみを含むことができます。 – Mat

+0

@Mat:しかし、他のエンコーディングや文字セットの文字列はまだNULLで終了していますが、そうではありませんか? –

+0

ヌルターミネーションでは不十分です。私は、 "基本的なソース文字セット"には '\ 0'が含まれていないと思います。 – Mat

答えて

8

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

+0

ちなみに、C99でもマクロを定義することができます。識別子と文字列リテラルを指定して呼び出すと、その文字列の長さを保持するコンパイル時定数構造体が作成され、その後に文字列のテキストは含まれますが、 null(C11できれいにコンパイルできるかどうかはわかりません)。そのようなことがC++のuser-defined-string-literal型で可能であるかどうかはわかりませんが、そうであれば便利かもしれません。 – supercat

+0

@supercat:文字列リテラルの長さを決めることはできますか?しかし、 'char const *'だけを渡した場合、文字列リテラルの長さは決めることができません!ヌル文字を見つけることによってサイズを決定する従来の方法は、最初のヌル文字までの文字列のサイズのみを決定します。何とか文字列リテラルのサイズが必要です(これは、あなたが記述しているマクロもまた、 'sizeof(literal)-1 'を使ってリテラルの文字数を決定します(末尾の' \ 0'を除く) 。 –

+0

もちろん、文字列のサイズが必要です。なぜなら、私が言及した構造が文字列の前に置く理由です。私の主張は、Cマクロでも整数定数としてリテラル文字列の長さを使用できるということでした。私のコードでは、文字列が0〜63バイト、0〜2047、0〜16777215(1,2,4バイトのプレフィックスを使用)のいずれかに基づいて異なる構造を生成する異なるマクロを使用していました。 1バイト、2バイト、4バイトのプレフィックスでチェックされた文字列バッファ。文字列処理メソッドは、プレフィックスタイプを自動検出し、また、... – supercat

6

文字列は常にC/C++ではnullで終了しますが、埋め込まれた文字を含めることはできません。"1234\05678"がありますが、この文字列はnullで終了しますが、その中に余分な '\ 0'が含まれます。

関連する問題