静态成员函数中的`this`类型?

时间:2013-05-13 14:46:40

标签: c++ c++11 language-lawyer

在C ++ 5.1.1 / 3 [expr.prim.general]中它说:

  

[{1}}]的类型和值类别在静态成员函数中定义。

这是什么意思?它有什么关系?

请注意:

  

this不会出现在静态成员函数的声明中

1 个答案:

答案 0 :(得分:78)

标准中的语言可以追溯到n3282,这是缺陷12071017的解决方案。特别是,该语言出现在提议的缺陷1207的决议中,因此应该在标准的背景下考虑,因为它在处理缺陷时就已经存在。当时使用*this(9.3.1p3)将id表达式重写为成员访问表达式时存在一些问题,特别是在trailing-return-type声明的上下文中(参见问题945) )。

如果我们将提出的缺陷1207的分辨率与n3282中的最终语言以及随后的标准进行比较,则与9.3.1p3存在一个显着差异:

缺陷1207:

  

当一个id-expression(5.1 [expr.prim])不属于类成员访问语法(5.2.5 [expr.ref])并且不用于形成指向成员的指针时(5.3.1 [ expr.unary.op])用于X 的成员函数的声明,如果名称查找(3.4 [basic.lookup])解析名称...

n3282和C ++ 11:

  

当一个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 ++标准讨论新闻组中提出这个问题;有可能在编辑上删除残留语言。