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
)在声明时位于namespace中(即不在全局命名空间中)?如果是这样,我希望标准能够说明这一点。 - 我认为17.6.4.3.2的第一部分(全局名称)是否排除了类似
_W
(后面跟大写字母)和__w
和_w__
(两个连续下划线)等用户定义的文字常数。正确吗?
编辑:
随着后续的发展,标准中还有部分内容:
13.5.8 用户定义的文字常数
[...]
2 声明符号是literal-operator-id的声明应该是命名空间范围内的函数或函数模板的声明(它可以是友元函数(11.3)),函数模板的显式实例化或特化,或使用声明(7.3.3)。用literal-operator-id声明的函数是文字操作符。用literal-operator-id声明的函数模板是文字操作符模板。
强调是我的。当它说"命名空间范围"时,这是否意味着用户定义的字面量需要在用户定义的命名空间中声明(即不在全局命名空间中)?
稍后编辑:
当问题被提出时,它不存在,但现在还有这个相关的问题和答案,读者可以在查看下面的答案之后再进行额外检查。
_<capital>
和__
,但是同名的全局变量(例如声明_i
并添加后缀_i
)不会冲突,因此第二条规则中的全局作用域部分不会干扰您的后缀。 - chris