gpt4 book ai didi

c++ - 在重载决议期间如何处理隐含的对象参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:19 29 4
gpt4 key购买 nike

N4296::13.3.1/5 [over.match.funcs] 说:

5 During overload resolution, the implied object argument is indistinguishable from other arguments. The implicit object parameter, however, retains its identity since conversions on the corresponding argument shall obey these additional rules:

(5.1) — no temporary object can be introduced to hold the argument for the implicit object parameter; and

(5.2) — no user-defined conversions can be applied to achieve a type match with it.

我不清楚最后一个限制,因为我认为候选函数集不可能包含两个或多个具有不同隐式对象参数的函数,因此有必要应用隐式转换来选择其中一个.例如:

struct B
{
void foo(int a){ }
};

struct C
{
void foo(int a){ }
};

struct A : B, C{ } a;

int main(){ a.foo(3); }

DEMO

在示例中,隐式 derived-to-base 类转换可能只适用。即使我们定义了显式转换,它也不会应用于隐含的对象参数。

所以不清楚 5.2 规则的引入是什么?

最佳答案

5.2 点是指存在用户定义 转换运算符。您没有提出这种情况,您只是提出了对存在于两个基类中的成员函数的模棱两可的调用,这涉及派生到基引用/指针转换,这是一种标准转换,而不是用户定义的转换,因此与 5.2 无关。

5.2 是针对这种情况的:

struct B
{
void foo(int a){ }
};

struct A {
B b;
operator B&() { return b; };
} a;

int main(){
a.foo(3); // ERROR (because of 5.2)
static_cast<B&>(a).foo(3); // OK
}

第 5.2 点只是意味着编译器无法尝试通过隐式用户定义的转换运算符(operator B&() 成员)最终找到候选“foo”函数。这与 foo 是像 void foo(B&, int) 这样的自由函数并被 foo(a,3) 调用的情况形成对比,在这种情况下, 编译器可以将 a 转换为 B& 以找到 foo 函数作为调用的可接受候选者。这是表达这一点的方式,因为成员函数版本和它的等效自由函数版本之间的行为是不同的。

because I think it's impossible for the set of candidate functions to contain two or more functions which would have different implicit object parameters

顺便说一句,你不需要有“两个或更多”来组成一组候选函数,一组候选函数也可以只由一个函数组成,甚至根本没有。正如 Piotr S. 所展示的那样,在这种特殊情况下,肯定有可能造成多个候选人可能具有不同的隐式对象参数类型的情况。

关于c++ - 在重载决议期间如何处理隐含的对象参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28259765/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com