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

Cor*_*lks 10 c++ c++11

在C++ 11中,我们获得了用户定义的文字.C++标准有这些例子,例如:

long double operator "" _w(long double);
Run Code Online (Sandbox Code Playgroud)

它说文字应该以下划线开头:

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"时,这意味着用户定义的文字需要在用户定义的命名空间中声明(即不在全局命名空间中)?

稍后编辑:

当问题第一次被问到时它不存在,但现在也有这个相关的问题和答案,读者可以在审查下面的答案后另外检查.

Luc*_*ton 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]交叉引用:

literal-operator-id:
operator ""identifier

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

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

  • @LucDanton:文字`_W`(大写)是不是也有问题,因为它成为实现定义宏的潜在冲突?因为当你声明它时,引号和标识符之间必须有一个空格(即``"_W`),所以`_W`是预处理器替换的公平游戏.正确? (2认同)