7

C++14 では、 の行に沿って、桁区切り記号の概念がリテラルに導入されました3'141'592'653'589。これは読み取り可能なコードにとって優れた機能ですが、 -type リテラルの数値部分のに引用符を使用できるかどうか疑問に思っていました。0x/0bそれは私には思われる:

unsigned int topThreeBits = 0b'1110'0000;
unsigned int hexNum       = 0x'dead'beef;

先頭のセパレーターがないものよりも読みやすい:

unsigned int topThreeBits = 0b1110'0000;
unsigned int hexNum       = 0xdead'beef;

数字から基数を明確に区別するためです。

私はまだ C++14 コンパイラを持っていないので、これが可能かどうかについて何らかの方法で確認する必要があります。

'123'456特に、パーサーはそれがchar変数なのか数値リテラルなのかを認識できないため、 のような接頭辞のない数値には意味がないことを私は知っています。

'しかし、プレフィックス付きリテラルの場合、トークンが最初に到着した時点で何を意味するのかについて混乱があるとは思えません0x/0b。数値リテラルになることは既に指示されています。

4

1 に答える 1

8

ドラフト C++14 標準の文法を見ると、 N4140セクション2.14.2 [lex.icon]では、16 進数またはバイナリ リテラルのベース インジケーターの直後では使用できません。

binary-literal:
  0b binary-digit
  0B binary-digit
  binary-literal ’opt binary-digit
[...]
hexadecimal-literal:
  0x hexadecimal-digit
  0X hexadecimal-digit
  hexadecimal-literal ’opt hexadecimal-digit

ただし、8 進リテラルでは、ベース インジケーターの後にセパレーターを使用できます。

octal-literal:
  0
  octal-literal ’opt octal-digit

ColiruWandboxなどの C++14 コンパイラを提供するオンライン コンパイラの 1 つを使用して確認することもできます。

この変更を追跡した Evolution ワーキング グループの問題は問題 27 でした: N3781 Single-Quotation-Mark as a Digit Separator, N3661, N3499 Digit Separators, N3448 Painless Digit Separation . この設計上の決定の明確な根拠はわかりません。おそらく、数字セパレーターの文字通りの解釈にすぎません。

現在の C または C++ 標準ドキュメントはどこで見つけることができますか?からドラフト標準のリストを見つけることができることに注意してください。.

于 2015-09-14T03:14:12.117 に答える