void operator"" test( const char* str, size_t sz )
{
std::cout<<str<<" world";
}
int main()
{
"hello"test;
return 0;
}
在GCC 4.7中,这会生成“警告:未在'_'之前的文字运算符后缀保留用于将来的标准化[默认启用]”
我理解为什么会生成此警告,但GCC会说“默认启用”。
是否可以在不通过-w标志禁用所有警告的情况下禁用此警告?
答案 0 :(得分:4)
在阅读了这个问题的几条评论之后,我回顾了C ++ 11标准(非最终草案N3337)。
当我说“我理解为什么会产生这个警告”时,我错了。 我认为标准在技术上并不需要下划线,而只是建议(因此警告而不是错误)。
但是,正如Nicol Bolas提出的那样,该标准在谈到用户定义的文字时使用以下语言:
“不以下划线开头的文字后缀标识符将保留用于将来的标准化。”
“包含此类ud后缀的程序格式错误,无需诊断。”
这类似于用于保留标识符的语言和“替代表示”,例如“和”,“或”,“不是”。我认为这很清楚,这首先不应该是一个警告,而是一个错误。
这可能不是“可以禁用”问题的直接答案,但它对我来说已经足够了。
Nicol如果你想提交你的评论作为答案我会改变你的答案(我认为这是可能的)。
答案 1 :(得分:0)
对于有价值的事情,-Wno-literal-suffix
会因为gcc-7(请参见godbold的现场直播)而忽略此警告,即此选项也turns off warnings for user defined literal operators without leading underscore:
-Wliteral后缀(仅C ++和Objective-C ++)
...
此外,当声明用户定义的文字运算符的文字后缀标识符不是 从下划线开始。文字后缀标识符不开头 带有下划线的标记保留用于将来的标准化。
但是,应该遵循@cmeub's answer中的建议,而应避免使用不带下划线的文字后缀标识符,因为它会导致格式错误的程序。