十六进制或二进制数中的数字之前是否允许使用数字分隔符?

Are digit separators allowed before the digits in a hex or binary number?

C++14 沿用 3'141'592'653'589 将数字分隔符的概念引入到文字中。现在这是可读代码的 很棒 功能,但我想知道它是否允许在 之前 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 已经规定了它是将是一个数字文字。

如果我们从draft C++14 standard: N4140部分看语法2.14.2[lex.icon],不允许紧跟在基数之后十六进制或二进制文字的指示符:

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

不过,八进制文字允许在基本指示符之后使用分隔符:

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

我们还可以使用提供 C++14 编译器的在线编译器之一进行检查,例如 Coliru or Wandbox

跟踪此更改的 Evolution Working Group 问题是 issue 27: N3781 Single-Quotation-Mark as a Digit Separator, N3661, N3499 Digit Separators, N3448 Painless Digit Separation。我没有看到这个设计决定的明显理由,也许它只是 digit separator.

的字面解释

请注意,我们可以从 Where do I find the current C or C++ standard documents? 中找到标准草案列表。