Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Пользовательский литерал с заглавной буквы

#cpp


На cppreference сказано, что следующий код выдаёт ошибку (пример в конце раздела
literal operators), однако у меня в gcc всё компилируется без каких-либо сообщений. Почему?

double operator"" _Z(long double) {
    return 0;
};

    


Ответы

Ответ 1



Идентификаторы, начинающиеся с подчеркивания и заглавное буквы являются зарезервированными для реализации. Но само по себе их использование не обязательно является ошибкой. Для пользовательских литералов действительно есть исключение, позволяющее использовать иначе зарезервированные идентификаторы при слитном написании. Такой случай приводится в стандарте в качестве примера: 16.5.8 User-defined literals [over.literal] 8. double operator""_Bq(long double); // OK: does not use the reserved identifier _Bq (5.10) double operator"" _Bq(long double); // uses the reserved identifier _Bq (5.10) Более конкретный пример того, чем это чревато. В VC++ имеются SAL аннотации, использующие макросы с зарезервированными идентификаторами, например _In_ #include double operator""_In_(long double) { // гарантировано работает return 0; } double operator"" _In_(long double) { // ошибка в vc++ или clang (c SAL) но работает в gcc return 0; }

Ответ 2



Пример на cppreference просто хочет сказать, что имена вроде _Z являются зарезервированными. То есть ошибка в том примере та же, что и, например, в объявлении int _Z; Однако нет ничего удивительного в том, что компиляторы не диагностируют такие нарушения. Имена эти зарезервированы для использования реализацией, однако когда компилятор получает уже "собранную" единицу трансляции на вход, в ней уже бывает трудно или невозможно отличить, какой код является пользовательским, а какой принадлежит реализации. Поэтому компилятору трудно понять, является ли каждое использование зарезервированного имени нарушением.

Комментариев нет:

Отправить комментарий