Възможно ли е да деактивирате предупреждението на 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
comment
Действителният отговор е тук и може да се комбинира с pragma. Лоша идея е да го направя в контекста на горния въпрос, но намерих този въпрос поради заглавието (всъщност се опитвах да получа функционалност на C++14 - ""s - в моето собствено пространство от имена в код на C++11) .   -  person firda    schedule 15.09.2014


Отговори (2)


След като прочетох няколко коментара по този въпрос, прегледах стандарта C++ 11 (не окончателен проект N3337).

Когато казах, че разбирам защо се генерира това предупреждение, сгреших. Предположих, че долната черта не е технически изисквана от стандарта, а просто препоръка (оттук и предупреждението, а не грешка).

Но както спомена Никол Болас, стандартът използва следния език, когато говори за дефинирани от потребителя литерали:

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

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

Това е подобно на езика, използван за запазени идентификатори и алтернативни представяния като и, или, не. Мисля, че това прави доста ясно, че това всъщност не трябва да е предупреждение на първо място, а грешка.

Това може да не е директният отговор на въпроса дали е възможно да се деактивира, но е достатъчен отговор за мен.

person cmeub    schedule 13.03.2013

За какво си струва, -Wno-literal-suffix заглушава това предупреждение от gcc-7 (вижте тук на живо на godbold), т.е. тази опция също изключва предупрежденията за дефинирани от потребителя литерални оператори без водеща долна черта:

-Wliteral-суфикс (само за C++ и Objective-C++)

...

Освен това предупреждавайте, когато дефиниран от потребителя литерал оператор е деклариран с идентификатор на литерал на суфикс, който не започва с долна черта. Литералните суфиксни идентификатори, които не започват с долна черта, са запазени за бъдеща стандартизация.


Човек обаче трябва да се придържа към съвета в отговора на @cmeub и по-скоро да избягва използването на буквални суфиксни идентификатори без долна черта, тъй като това води до неправилно формирани програми.

person ead    schedule 28.08.2019