Разрешены ли разделители цифр перед цифрами в шестнадцатеричном или двоичном числе?
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
уже продиктовал это будет числовой литерал.
1 ответ
Если мы посмотрим на грамматику из черновика стандарта C++14: раздел 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 или Wandbox.
Проблема рабочей группы Evolution, которая отслеживала это изменение, была проблемой 27: N3781, одиночная кавычка в качестве разделителя цифр, N3661, разделители цифр N3499, разделение цифр безболезненно N3448. Я не вижу очевидного обоснования этого дизайнерского решения, возможно, это только буквальная интерпретация разделителя цифр.
Обратите внимание, что список проектов стандартов можно найти в разделе Где найти текущие стандартные документы C или C++?,