gpt4 book ai didi

C++ 非常量-常量引用函数重载

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:40 24 4
gpt4 key购买 nike

在下面的代码中:

int foo(const int& f) //version 1
{
int g = f;
return int(foo(g)); // calls itself, turning into SO
}

int& foo(int& f) //version 2
{
f *= -1;
return f;
}

int main()
{
int f = 11;
cout << foo(f) << endl;
cout << foo(22) << endl;
}

第一个 cout 按预期打印 -11; f 是一个左值,因此它绑定(bind)到 foo 的第二个版本(尽管它也可以绑定(bind)到第一个版本,但第二个版本更匹配)。

foo 的第二次调用使用右值作为参数,因此唯一可行的 foo 版本是第一个。到目前为止,一切都很好。在 foo 的第一个版本中,我复制了一个参数,这样我就可以调用第二个版本(使用 lvalue)并在调用之后返回它的一个拷贝foo 的第二个版本。问题是这会变成堆栈溢出;仍将调用 foo 的第一个版本。

有人可以向我解释为什么会这样吗?我希望 foo 的第一个版本中的 g 在作为参数传递时绑定(bind)到 foo 的第二个版本。

最佳答案

这真的很简单 - foo 在这一点上只意味着 foo(const int& f)。没有第二个选择。还没有。切换定义。或者将它们分开:

int foo(const int& f);
int& foo(int& f);

int main()
{
int f = 11;
cout << foo(f) << endl;
cout << foo(22) << endl;
}


int foo(const int& f) //version 1
{
int g = f;
return int(foo(g)); // calls itself, turning into SO
}

int& foo(int& f) //version 2
{
f *= -1;
return f;
}

关于C++ 非常量-常量引用函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20223711/

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