Подтвердить что ты не робот

Можно ли отключить предупреждение 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?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

-Wliteral-suffix (C++ и Objective-C++ only)

...

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


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