在 C++11 中,我们得到用户定义的文字。C++ 标准有这些例子,例如:
long double operator "" _w(long double);
它说文字应该以下划线开头:
17.6.4.3.5 用户定义的文字后缀
不以下划线开头的文字后缀标识符保留用于将来的标准化。
但是,标准中有另一部分说
17.6.4.3.2 全局名称
某些名称集和函数签名始终保留给实现:
— 每个包含双下划线 _ _ 或以下划线后跟大写字母 (2.12) 的名称都保留给实现任何用途。
— 每个以下划线开头的名称都保留给实现用作全局名称空间中的名称。
我希望更好地了解 17.6.4.3.2(全局名称)的确切含义/含义以及它与 17.6.4.3.5(用户定义的文字后缀)的关系。具体来说:
- 17.6.4.3.2(全局名称)的第二部分是否需要
_w
在命名空间(即不在全局命名空间)中定义用户定义的文字(如上面的)?如果是这样,我希望标准能够说明这一点。 - 我认为 17.6.4.3.2(全局名称)的第一部分排除了用户定义的文字,如
_W
(后跟大写字母)__w
和_w__
(两个连续的下划线)。正确的?
编辑:
作为跟进,标准的一部分说:
13.5.8 用户定义的文字
[...]
2其 declarator-id 是文字操作符 id 的声明应是命名空间范围函数或函数模板的声明(它可以是友元函数 (11.3)),函数模板的显式实例化或特化,或使用声明(7.3.3)。使用 literal-operator-id 声明的函数是文字运算符。使用 literal-operator-id 声明的函数模板是文字运算符模板。
强调我的。当它说“命名空间范围”时,这是否意味着用户定义的文字需要在用户定义的命名空间中声明(即不在全局命名空间中)?
后期编辑:
刚开始问这个问题的时候是没有的,现在也有这个相关的问答,读者可以在查看下面的答案后额外检查。