【问题标题】:Type of `this` in static member function?静态成员函数中的“this”类型?
【发布时间】:2013-05-07 15:43:03
【问题描述】:

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

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

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

请注意:

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

【问题讨论】:

  • 来人,给 Bjarne 打电话!
  • 您引用的文本不在 N3242 中。最终标准是否可以在某个地方公开获得?
  • 它来自 N3485(2012 年 11 月)
  • @Zack:是的,但你必须为此付费。最便宜的来源可能是here。最接近已发布标准的草案是n3337
  • 你对@ecatmur 在他下面的回答中提到的“遗迹语言”得到了合理的解释吗?我已经看到您与 Jens Maurer here 的讨论,但 AFAICT 您的问题尚未得到解答。

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


【解决方案1】:

标准中的语言可以追溯到n3282,这是针对缺陷1207和1017的解决方案。特别是,该语言出现在针对缺陷 1207 的提议决议中,因此应在解决该缺陷时的标准上下文中进行考虑。当时有人担心使用 *this (9.3.1p3) 将 id 表达式重写为成员访问表达式,特别是在尾随返回类型声明的上下文中(参见问题 945)。

如果我们将提议的解决方案与缺陷 1207 与 n3282 和随后的标准中的最终语言进行比较,则与 9.3.1p3 有一个显着差异:

缺陷 1207:

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

n3282 和 C++11:

当 id 表达式 (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 时,这已解决,有利于合格 id 转换(也是 9.3.1p3),它不需要 this,但 5.1.1p3 中的语言仍然存在。

我建议在 C++ 标准讨论新闻组中提出这个问题;有可能在编辑上删除残留的语言。

【讨论】:

  • OK 生病的邮件 isocpp/discuss.
  • 如果可以的话,我会给你一个很好的答案徽章。
  • @LuchianGrigore:你不必这样做。 ;)
  • 好的,我交叉发布到 isocpp/discuss here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多