C++ 不带下划线的用户定义文字

C++ 不带下划线的用户定义文字,c++,c++11,c++14,user-defined-literals,C++,C++11,C++14,User Defined Literals,根据,可以使用 CSomeClass operator ""s(const char* literal, size_t size); 现在读完这一段,我认为也可以定义 CSomeClass operator ""r(const char* literal, size_t size); (注意rud后缀,而不是s) 重载s只会发出叮当声警告 warning: user-defined literal suffixes not starting with '_' are reserved [-W

根据,可以使用

CSomeClass operator ""s(const char* literal, size_t size);
现在读完这一段,我认为也可以定义

CSomeClass operator ""r(const char* literal, size_t size);
(注意
r
ud后缀,而不是
s

重载
s
只会发出叮当声警告

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后缀有效。

用户定义的文字必须以下划线开头。\ux:不以下划线开头的后缀保留给标准库提供的文字运算符。

您不了解警告的哪一部分?它表示文字必须以
开头。你链接到的参考资料也是如此。你不能声明一个名为
r
,但你可以声明一个名为
\u r
。阅读引用我理解,由于c++14可以重载而不带下划线。好的,我可以看出该引用的措辞可能意味着限制只应用于带有空格的表单,而不是新的c++14表单。不过,该标准非常明确:“不以下划线开头的文字后缀标识符将保留用于将来的标准化。”@Mike Seymour cppreference编辑以强调这一点,您是使用C++14编译
s
还是使用C++11编译
r
?我想我对其中一个的警告和另一个的错误感到困惑。我确实记得有一次要求“”和标识符在没有中间空间的情况下进行接触。然后就放松了。我不记得那是C++14还是C++11上的DR。。我会查一查,但我很确定他是一个反对C++11.Hm的博士。。在哪里,它实际上是说第二个替代品(标记为<代码> C++ 14 )被保留在标准库(在站点上还是在标准中)?@ UROC327在定义中的代码> UD后缀< /代码>。是否打算允许使用当今编译器的程序员编写代码,当在没有“qqz”的编译器上运行时,这些代码将以与未来标准相同的方式定义“qqz”?