Можно ли отключить предупреждение 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?
Ответы
Ответ 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 и избегать использования буквенных идентификаторов суффиксов без подчеркивания, так как это приводит к плохо сформированным программам.