Разрешает ли C ++ 17 не-ascii символ в качестве идентификатора? - PullRequest
0 голосов
/ 24 апреля 2018

В cppref я нахожу странный код C ++, который использует не-ascii символ в исходном коде следующим образом:

template <char...> double operator "" _π(); // OK

Однако приведенный выше код нельзя скомпилировать с clang 6.0. Сообщение об ошибке:

error : source file is not valid UTF-8
1>double operator "" _<A6><D0>()
1>                    ^

Мои вопросы:

  1. Соответствует ли это C ++ 17?
  2. Обратите внимание, что пользовательский не имеет аргумента, тогда как использовать ? Просто используйте double var = _π;?

1 Ответ

0 голосов
/ 24 апреля 2018

По указанной вами ссылке он цитирует:

Если литеральный оператор является шаблоном, он должен иметь пустой список параметров и может иметь только один параметр шаблона, который должен быть неПакет параметров шаблона типа с типом элемента char

template <char...> double operator "" _x();

Давайте посмотрим, что это значит,

Обозначение char... указывает, что этот шаблон может быть создан с 0, 1, 2или больше параметров типа char.Это означает, что каждый раз, когда компилятор встречает литерал, подобный 1234_km, он должен обрабатывать его как следующий вызов функции:

operator"" _km<'1', '2', '3', '4'>();

Вся строка, представляющая литерал, передается (прерывается) как аргумент шаблона.См. это и это для использования.

А что касается допустимого диапазона символов: (См. Это Приложение E )

00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF
0100-167F, 1681-180D, 180F-1FFF
200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
3004-3007, 3021-302F, 3031-303F
3040-D7FF
F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD,
60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD,
B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD
...