Можно ли отключить предупреждение GCC об отсутствии подчеркивания в пользовательском литерале?

void operator"" test( const char* str, size_t sz  )
{
    std::cout<<str<<" world";
}

int main()
{
    "hello"test;
    return 0;
}

В GCC 4.7 это генерирует «предупреждение: суффиксы литеральных операторов, которым не предшествует '_', зарезервированы для будущей стандартизации [включено по умолчанию]"

Я понимаю, почему генерируется это предупреждение, но GCC говорит «по умолчанию включено».

Можно ли отключить это предупреждение, не отключая все предупреждения с помощью флага -w?


person cmeub    schedule 12.03.2013    source источник
comment
Ничего себе, я не знал, что C++11 поддерживает перегрузку оператора. Кстати, g++, присутствующий в ideone, по крайней мере, не предупреждает, но мой локальный компилятор предупреждает. Просто для информации других (кто не знает контекста), изменив test на _test, предупреждение исчезнет.   -  person iammilind    schedule 12.03.2013
comment
Почему вы хотите? Есть все шансы, что более поздние версии C++ будут содержать потенциально конфликтующие символы. Это плохо. Проблема GCC в том, что он не выдает ошибку так, как должен.   -  person Nicol Bolas    schedule 12.03.2013
comment
@Nicol, ценю ваш комментарий, и это предупреждение действительно приводит к ошибке для меня, потому что я использую -Werror. У нас есть много ценных предупреждений в GCC, но мы по-прежнему позволяем программисту отключать их явно.   -  person cmeub    schedule 12.03.2013
comment
@cmeub: Но это моя точка зрения: это не должно быть предупреждением. Предполагается, что это ошибка. В соответствии со стандартом C++11 неправильно определять определяемый пользователем литерал, который не начинается с _. GCC не должен позволять вам отключать его, точно так же, как он не должен позволять вам отключать ссылки на r-значения, шаблоны с переменным числом аргументов или любую другую индивидуальную функцию C++11. Радуйтесь, что он позволяет отключить исключения и RTTI.   -  person Nicol Bolas    schedule 12.03.2013
comment
Из любопытства, не могли бы вы объяснить, почему вам абсолютно необходимо использовать определяемые пользователем литералы без подчеркивания?   -  person Piotr99    schedule 12.03.2013


Ответы (2)


Прочитав несколько комментариев к этому вопросу, я просмотрел стандарт C++ 11 (не окончательный проект N3337).

Когда я сказал, что понимаю, почему генерируется это предупреждение, я ошибся. Я предположил, что подчеркивание технически не требуется стандартом, а просто является рекомендацией (отсюда предупреждение, а не ошибка).

Но, как заметил Никол Болас, в стандарте используется следующий язык, когда речь идет о пользовательских литералах:

Буквенные идентификаторы суффиксов, которые не начинаются с подчеркивания, зарезервированы для будущей стандартизации. usrlit.suffix

Некоторые буквенные идентификаторы суффиксов зарезервированы для будущей стандартизации; см. [usrlit.suffix]. Объявление, чей literal-operator-id использует такой литеральный идентификатор суффикса, неправильно сформировано, диагностика не требуется. over.literal

Это похоже на язык, используемый для зарезервированных идентификаторов и альтернативных представлений, таких как и, или, не. Я думаю, что это ясно дает понять, что на самом деле это должно быть не предупреждением, а ошибкой.

Это не может быть прямым ответом на вопрос, можно ли отключить, но для меня этого ответа достаточно.

person cmeub    schedule 13.03.2013

Что бы это ни стоило, -Wno-literal-suffix отключает это предупреждение, начиная с gcc-7 (см. здесь в прямом эфире на godbold), т. е. этот параметр также отключает предупреждения для определенных пользователем литеральные операторы без подчеркивания в начале:

-Wliteral-suffix (только C++ и Objective-C++)

...

Кроме того, предупреждайте, когда пользовательский литеральный оператор объявляется с литеральным суффиксным идентификатором, который не начинается с символа подчеркивания. Буквенные идентификаторы суффиксов, которые не начинаются с подчеркивания, зарезервированы для будущей стандартизации.


Однако следует придерживаться совета в @cmeub answer и избегать использования буквенных суффиксных идентификаторов без подчеркивания, так как это приводит к плохо оформленные программы.

person ead    schedule 28.08.2019