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
уже продиктовал это будет числовой литерал.
Если мы посмотрим на грамматику из черновик стандарта C ++ 14: N4140 раздел 2.14.2
[словарный запас], он не допускается сразу после базового индикатора шестнадцатеричных или двоичных литералов:
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 ++?.