在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(用户定义的字面文字)的关系.特别:
_w在命名空间中定义用户定义的文字(如上所述)(即不在全局命名空间中)?如果是这样,我希望标准能说明这一点._W(大写)__w和_w__(两个连续的下划线).正确?编辑:
作为后续行动,标准的一部分说:
13.5.8用户定义的文字
[...]
2 声明者id为文字操作符id的声明应该是命名空间范围函数或函数模板的声明(它可以是友元函数(11.3)),函数模板的显式实例化或特化,或者使用声明(7.3.3).使用literal-operator-id声明的函数是文字运算符.使用literal-operator-id声明的函数模板是文字运算符模板.
强调我的.当它说"namespace-scope"时,这意味着用户定义的文字需要在用户定义的命名空间中声明(即不在全局命名空间中)?
稍后编辑:
当问题第一次被问到时它不存在,但现在也有这个相关的问题和答案,读者可以在审查下面的答案后另外检查.
什么名字?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;也是保留的.