10

在 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 声明的函数模板是文字运算符模板。

强调我的。当它说“命名空间范围”时,这是否意味着用户定义的文字需要在用户定义的命名空间中声明(即不在全局命名空间中)?

后期编辑:

刚开始问这个问题的时候是没有的,现在也有这个相关的问答,读者可以在查看下面的答案后额外检查。

4

1 回答 1

8

名字里有什么?3 基本概念【基本】告诉我们:

4 名称是标识符 (2.11)、operator-function-id (13.5)、literal-operator-id (13.5.8)、conversion-function-id (12.3.2) 或 template-id (14.2) 的使用) 表示实体或标签 (6.6.4, 6.1)。

我们与 13.5.8 用户定义的文字 [over.literal] 交叉引用:

文字操作符 id
operator ""标识符

虽然文字运算符的名称涉及标识符,但该标识符并不表示实体。(或者它是完全表示另一个实体或标签的不同标识符和不同名称。)因此,文字运算符的名称永远不会以下划线开头。

类似的东西operator""__w 有问题的,但这不是新的:int i__0;也是保留的。

于 2012-10-04T06:47:11.807 回答