【发布时间】:2012-10-04 06:36:05
【问题描述】:
在 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 为 literal-operator-id 的声明应是命名空间范围函数或函数模板的声明(它可以是友元函数 (11.3))、显式实例化或函数模板的特化,或使用声明(7.3.3)。使用 literal-operator-id 声明的函数是文字运算符。使用 literal-operator-id 声明的函数模板是文字运算符模板。
强调我的。当它说“命名空间范围”时,这是否意味着用户定义的文字需要在用户定义的命名空间中声明(即不在全局命名空间中)?
后期编辑:
第一次提出问题时不存在,但现在还有this related question and answer,,读者可以在查看以下答案后额外检查。
【问题讨论】:
-
哈,有趣!如果你问我,这看起来像是一个疏忽。
-
文字后缀不是名称。根据该解释,17.6.4.3.2 不适用于 17.6.4.3.5。
-
Consider this。它仍然会被 pp 破坏,它可以应用于
_<capital>和__,但是同名的全局变量(例如声明_i并制作后缀_i)不冲突,所以没有第二条规则的全局范围部分会干扰您的后缀。 -
@chris:除了预处理器相当盲目地替换那里的令牌;这根本不表明它是一个名字。这类似于预处理器可以替换不是名称的关键字的方式。实际用作后缀时,它也不应该影响后缀。
-
From 3.3.6 Namespace scope [basic.scope.namespace]: "3 翻译单元的最外层声明区域也是一个命名空间,称为全局命名空间。在全局命名空间中声明的名称有全局命名空间范围(也称为全局范围)。[...]"