在C ++ 5.1.1 / 3 [expr.prim.general]中它说:
[{1}}]的类型和值类别在静态成员函数中定义。
这是什么意思?它有什么关系?
请注意:
this
不会出现在静态成员函数的声明中
答案 0 :(得分:78)
标准中的语言可以追溯到n3282,这是缺陷1207和1017的解决方案。特别是,该语言出现在提议的缺陷1207的决议中,因此应该在标准的背景下考虑,因为它在处理缺陷时就已经存在。当时使用*this
(9.3.1p3)将id表达式重写为成员访问表达式时存在一些问题,特别是在trailing-return-type声明的上下文中(参见问题945) )。
如果我们将提出的缺陷1207的分辨率与n3282中的最终语言以及随后的标准进行比较,则与9.3.1p3存在一个显着差异:
当一个id-expression(5.1 [expr.prim])不属于类成员访问语法(5.2.5 [expr.ref])并且不用于形成指向成员的指针时(5.3.1 [ expr.unary.op])用于类
X
的成员函数的声明,如果名称查找(3.4 [basic.lookup])解析名称...
当一个id-expression(5.1 [expr.prim])不属于类成员访问语法(5.2.5 [expr.ref])并且不用于形成指向成员的指针时(5.3.1 [ expr.unary.op])在类
X
的成员中用于可以使用this
的上下文中(5.1.1 [expr.prim.general]) ,如果名称查找(3.4 [basic.lookup])解析名称[...]
很明显,提出的缺陷1207的解决方案认为静态成员函数中的id表达式(对于静态成员)需要转换为*this
成员访问表达式,因此需要访问到this
的类型和值类别。到编写n3282时,已经解决了这个问题,转而采用了不需要this
的qualified-id转换(也是9.3.1p3),但5.1.1p3中的语言仍然存在。
我建议在C ++标准讨论新闻组中提出这个问题;有可能在编辑上删除残留语言。