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

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

在 GCC 4.7 中,这会生成“警告:不以 '_' 开头的文字运算符后缀保留用于将来的标准化 [默认启用]”

我理解为什么会生成此警告,但 GCC 说“默认启用”。

是否可以在不通过 -w 标志禁用所有警告的情况下禁用此警告?

4

2 回答 2

5

在阅读了对该问题的几条评论后,我回顾了 C++ 11 标准(非最终草案 N3337)。

当我说“我明白为什么会产生这个警告”时,我错了。我认为标准在技术上不要求下划线,而只是一个建议(因此是警告而不是错误)。

但正如 Nicol Bolas 提出的,该标准在谈到用户定义的文字时使用以下语言:

“不以下划线开头的文字后缀标识符保留用于将来的标准化。” usrlit.suffix

“一些文字后缀标识符保留用于将来的标准化;请参阅 [usrlit.suffix]。其文字操作符 id 使用此类文字后缀标识符的声明格式不正确,无需诊断。” 过字面

这类似于用于保留标识符的语言和“替代表示”,例如“and”、“or”、“not”。我认为这很清楚地表明这实际上不应该是一个警告,而是一个错误。

这可能不是对“是否可以禁用”问题的直接回答,但对我来说已经足够回答了。

于 2013-03-13T19:31:14.213 回答
1

值得一提的是,-Wno-literal-suffix自 gcc-7 以来此警告静音(请参阅此处 live on godbold),即此选项还关闭用户定义的文字运算符的警告,而无需前导下划线

-Wliteral-suffix(仅限 C++ 和 Objective-C++)

...

此外,当用户定义的文字运算符使用不以下划线开头的文字后缀标识符声明时发出警告。不以下划线开头的文字后缀标识符保留用于将来的标准化。


但是,应该坚持@cmeub 的回答中的建议,而不是使用没有下划线的文字后缀标识符,因为它会导致程序格式错误。

于 2019-08-28T07:57:52.600 回答