在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(用户定义的字面文字)的关系。具体做法是:
_w
)(即不在全局命名空间中)?如果是这样,我希望标准能说明这一点。_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,,读者可以在查看下面的答案后另外检查。
答案 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;
也是保留的。