用户定义的文字,下划线和全局名称

时间:2012-10-04 06:36:05

标签: c++ c++11

在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 声明者id为文字操作符id的声明应该是命名空间范围函数或函数模板的声明(它可以是友元函数(11.3)),显式实例化或函数模板的特化或使用声明(7.3.3)。使用literal-operator-id声明的函数是文字运算符。使用literal-operator-id声明的函数模板是文字运算符模板。

强调我的。如果它说“namespace-scope”这意味着用户定义的文字需要在用户定义的命名空间中声明(即不在全局命名空间中)?

稍后编辑:

首次提出问题时,它不存在,但现在还有this related question and answer,,读者可以在查看下面的答案后另外检查。

1 个答案:

答案 0 :(得分:8)

名字中有什么? 3基本概念[基本]告诉我们:

  

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

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

  

字面运营商-ID
   operator ""标识符

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

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