在C++11中,我们得到用户定义的文字.C++标准有这些例子,例如:
long double operator "" _w(long double);它说文字应该以下划线开头:
17.6.4.3.5用户-definedffiffixes 不以下划线开头的文本suffix identifiers保留用于将来的标准化。
然而,在标准中还有一个部分说
17.6.4.3.2全球名称 某些名称和函数签名始终保留在实现中: -每个包含双下划线_或的名称以下划线开头,后面跟着大写字母(2.12),保留给实现,供任何使用。 -以下划线开头的每个名称都保留给实现,以便作为全局命名空间中的名称使用。
我希望更好地理解17.6.4.3.2 (全球名称)所说的/意思,以及它与17.6.4.3.5 (Userfined文本suffixes)之间的关系。具体地说:
_w)在命名空间(也就是说,不是在全局名称空间中)中定义?如果是这样的话,我希望标准能说明这一点。_W (后面跟着大写)以及__w和_w__ (两个连续的下划线)。对,是这样?编辑:
作为后续行动,有一部分标准规定:
13.5.8用户-defined文本 ..。 2声明符id为文字运算符id的声明应是名称空间范围函数或函数模板的声明(可以是友函数(11.3))、函数模板的显式实例化或专门化或使用-声明(7.3.3)。用文字运算符id声明的函数是文字运算符.用文字运算符id声明的函数模板是文字运算符模板.
强调我的。当它说“命名空间范围”时,这是否意味着用户定义的文字需要在用户定义的名称空间(即不在全局名称空间中)中声明?
稍后编辑:
当这个问题第一次被问到时,它并不存在,但是现在也有了this related question and answer,,读者可以在查看下面的答案之后再检查它。
发布于 2012-10-04 06:47:11
名字里有什么?三个基本概念告诉我们:
4名称是使用标识符(2.11)、运算符-函数-id (13.5)、文字-运算符-id (13.5.8)、转换-函数-id (12.3.2)或模板-id (14.2)表示实体或标签(6.6.4、6.1)。
与13.5.8用户定义的文字over.literal交叉引用
文字-运算符-id:
operator ""标识符
虽然文字运算符的名称涉及一个标识符,但该标识符并不表示实体。(或者是一个不同的标识符和不同的名称,它表示另一个实体或标签。)因此,文字运算符的名称从不以下划线开头。
像operator""__w这样的东西是有问题的,但这并不新鲜:int i__0;也是保留的。
https://stackoverflow.com/questions/12721584
复制相似问题