在命名成员函数重载决议过程中,this指针何时不在作用域?
在命名成员函数重载决议中,this指针何时不在作用域?
咱们先从C++的重载决议逻辑说起:当你调用一个命名函数时,如果表达式是主表达式,会按照常规规则查找函数名(可能会触发ADL依赖于参数的查找)。如果查到的是某个类T的成员函数,这时候就要看this的状态了——只有当this在当前作用域内,并且指向的是T类型的对象时,才会把*this当作隐式对象实参来参与重载决议。
那什么时候this会不在作用域呢?主要有两类场景:
- 非成员函数的上下文:比如全局函数、命名空间里的普通函数,这些地方从一开始就没有
this指针的概念,自然this不在作用域里。你要是在这儿调用某个类的成员函数,编译器就会知道没法用this来绑定对象,会进入后续的伪对象实参处理逻辑(当然最终除非是静态成员函数,否则这种调用会编译失败)。 - 类的静态成员函数内部:静态成员函数属于整个类,不属于任何具体的对象实例,所以它的内部也不存在
this指针,this自然不在作用域内。哪怕你在静态成员函数里调用同一个类的非静态成员函数,也没法用this来绑定,必须显式传递对象实例才行。
引用相关标准描述:
命名函数的调用<...>如果表达式E是主表达式,则按照函数调用的常规规则查找名称(可能涉及ADL)。通过此查找找到的函数声明(由于查找方式的原因)要么是:<...> b) 某个类T的所有成员函数,在这种情况下,如果this在作用域内且指向T,则*this用作隐式对象实参。否则(如果this不在作用域内或不指向T),一个伪对象实参被用于重载决议,但这样的调用在最终会因为缺少对象而无法通过编译(除非是静态成员函数)。
内容的提问来源于stack exchange,提问作者ledonter
相关产品推荐
相关产品推荐

