用户自定义字面量(User-defined literals)无下划线

10
根据 cppreference ,可以使用以下方式定义字面值。
CSomeClass operator ""s(const char* literal, size_t size);

现在阅读完这段文字后,我认为也有可能定义。
CSomeClass operator ""r(const char* literal, size_t size);

(请注意后缀 r,而不是 s。)
重载 s 只会导致clang警告。
warning: user-defined literal suffixes not starting with '_' are reserved [-Wuser-defined-literals]

我正在使用-std=c++14编译,对此并不是很理解。重载r会产生什么效果。

error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
warning: user-defined literal suffixes not starting with '_' are reserved; no literal will invoke this operator [-Wuser-defined-literals]

这对我来说似乎更不可靠。

为什么clang会发出这些警告/错误,我该如何使r的ud后缀有效。


1
警告的哪一部分你不明白?它说你的文字必须以“_”开头。你链接的参考文献也是如此。你不能声明一个叫做“r”的,但可以声明一个叫做“_r”的。 - Mike Seymour
通过阅读参考文献,我了解到自C++14以来可以不使用下划线进行重载。 - Uroc327
好的,我可以理解那个引用的措辞可能会暗示该限制仅适用于带有空格的形式,而不是新的C++14形式。然而标准非常清楚:「不以下划线开头的文字后缀标识符被保留用于未来的标准化。」 - Mike Seymour
3
@Mike Seymour 您好,"cppreference"已经进行了编辑以强调这一点。 - Cubbi
你是用C++14编译s,用C++11编译r吗?我猜我对一个有警告而另一个有错误感到困惑。我记得曾经要求""和标识符必须紧贴着,不能有空格。然后这个规定被放宽了。我不记得这是C++14还是C++11的DR。我会查一下,但我很确定他是针对C++11的DR。 - emsr
显示剩余2条评论
1个回答

13

用户定义的字面量必须以下划线 _ 开头:不以下划线开头的后缀保留给标准库提供的字面量操作符。


嗯,好的。它实际上在哪里说明第二个选择(标有since C++14)是为标准库保留的(无论是在网站上还是在标准中)? - Uroc327
2
@Uroc327 在 ud-suffix 的定义中。 - orlp
2
如果未来的 C++ 添加了例如“qqz”字面后缀并具有某些含义,是否意味着今天使用编译器的程序员应该被允许编写代码,在没有“qqz”的编译器上运行时,会以与未来标准相同的方式定义“qqz”? - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接