C++ 十六进制或二进制数字前是否允许使用数字分隔符?

C++ 十六进制或二进制数字前是否允许使用数字分隔符?,c++,c++14,digit-separator,C++,C++14,Digit Separator,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

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
已经指示它将是一个数字文本。

如果我们从
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编译器(如或)的在线编译器之一进行检查

跟踪这一变化的进化工作组问题是。我看不出这个设计决策有什么明显的理由,也许它只是对数字分隔符的字面解释


注:我们可以从中找到标准草案列表。

谢谢。链接也很好,我一直在使用codingground,但这似乎只适用于GCC4.8.x,它不是C++14.0,除了八进制指示符。在
0
@hvd之后立即允许它。我应该更详细地说明,我更新了我的答案。一个有趣的问题是,是否可以扩展词汇语法以允许它。我得承认我喜欢这个样子。这对八进制特别有帮助(尽管这是可行的)。IIRC当我在g++中实现digit seps时,看起来我可以在不破坏东西的情况下允许它。@emsr看起来可以毫无问题地支持它,我还没有深入考虑它。与EWG问题相关的四项提案均未给出该决定的理由。我想知道它是否仅仅被认为是一个数字发声器,我只是想知道同样的道理。正如答案所说,这是不可能做到的(现在?)。因此,要获得对称数字/半字节/等等,我们必须满足于下一个最好的东西:
0b0'1110'0000
()和
0x0'dead'beef
()下划线d,前面的
0
实际上是一个绝妙的主意,不是我想到的。前导零对值没有影响,它仍然允许视觉上明显的“实数部分”。是的,简单但有效,有时这样的事情很容易错过:-)