42

clang は次の行をコンパイルしますが、g++ 6.1 は桁区切り記号について不平を言います ( Coliru のライブ例を参照)。

auto time = 01'23s;

C++14 標準 (N3796) に従って正しいコンパイラはどれですか?

それ以外の場合、桁区切り記号 (§2.14.2) は、<chrono>ライブラリ (§20.12.5.8) のユーザー定義リテラル (§2.14.8) の実装の詳細にすぎませんか? unsigned long longこれらのリテラルはパラメーターで定義されているため、私見ではありません。

Howard HinnantがCppCon 2016 のトーク "A tutorial" (トークの約 42 分) で10'000s例として使用したことを覚えています。<chrono>


( 8 進リテラル 0123 は 64 + 16 + 3 == 83 であるため、 「1 分 23 秒」をコード化するつもりはなかったことに注意してください。これは偶然に正しいだけです。その目的のために、次のように記述します。

auto time = 1min + 23s;

しかし、その誤解を招く可能性のある解釈は問題の一部ではありません.)

4

3 に答える 3

19

文法を見ると、user-defined-integer-literaloctal-literal ud-suffixにすることができ、octal-literal0はor octal-literal '<sub>opt octal-digit のいずれかとして定義されます。

N4140 §2.14.8

ユーザー定義リテラル:

  • ユーザー定義の整数リテラル
  • [...]

ユーザー定義の整数リテラル:

  • 8 進数リテラル ud 接尾辞
  • [...]

</p>

N4140 §2.14.2

8 進リテラル:

  • 0
  • 8 進数リテラル '<サブ>opt 8 進数

01'23s完全に有効なリテラルも同様です。

于 2016-10-26T12:27:50.477 に答える
5
于 2016-10-26T12:28:40.710 に答える