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


75

在C ++ 5.1.1 / 3 [expr.prim.general]中,它表示:

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

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

注意:

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


31
有人,给比耶恩打电话!
亚历山大·舒卡耶夫

您引用的文本不在N3242中。最终标准是否在某个地方公开可用?
zwol

它来自N3485(2012
安德鲁·

3
@Zack:是的,但您必须为此付费。最便宜的货源可能在这里。最接近已发布标准的草案是n3337
Mike Seymour,

您是否对@ecatmur在下面的回答中提到的所谓“调查语言”有合理的解释?我已经看到了Jens Maurer拥有你们的讨论在这里,但AFAICT你的问题尚未解答。
Belloc

Answers:


78

该标准中的语言可以追溯到n3282,它是缺陷12071017的解决方案。特别地,该语言出现在缺陷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时,已经解决了该问题,转而使用了qualified-id转换(又是9.3.1p3),该转换不需要this,但是5.1.1p3中的语言仍然保留下来。

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


好的邮件isocpp / discuss。
安德鲁·托马佐斯

如果可以的话,我会给你一个很棒的答案徽章。
Luchian Grigore

@LuchianGrigore:您不必。;)
ere13年

1
好吧,我在这里
Andrew Tomazos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.