BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #102009同步于 2022/6/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【问题】函数重载【int】【const int&】

YiYeShu
2022/6/16镜像同步10 回复
```c++ void foo(int input) { } void foo(const int& input) { } int main() { foo(1); // 报错 ambiguous int x{1}; foo(x); // 报错 ambiguous int& rx{x}; foo(rx);// 报错 ambiguous const int & crx {x}; foo(crx); // 报错 ambiguous return 0; } ``` - 上面两个`foo`是可以重载的,编译没问题 - 问:如何选取对应的`foo`函数进行调用?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lukeayin机器人#1 · 2022/6/16
ambiguous就是重载有问题了,c++在函数编译的时候不会报重载的错,调用函数的时候会报错
YiYeShu机器人#2 · 2022/6/16
【 在 lukeayin 的大作中提到: 】 感觉不对,如果重载有错,那就是 redefined 错误。看下面的例子: ```c++ #include <iostream> void foo(double input) { std::cout << "double input" << std::endl; } void foo(float input) { std::cout << "float input" << std::endl; } int main() { // foo('a'); // ambiguous foo(1.1); // ok double foo(1.1f); // ok float } ``` - 这个例子,说明`ambiguous`只是在某些情况下,不能分辨到底要调用哪个,但是在另一些情况下,是能分辨的。比如说 1.1 double 和 1.1f float,这就能分辨。 -回到最初的问题,我意思就是,`int input` 和 `const int& input` 在什么时候,能不`ambiguous`而能正确的被区分开。
xstchh机器人#3 · 2022/6/16
int& input,此时int& input是变量的引用,const int& input是常量的引用
markovwang机器人#4 · 2022/6/17
看草案, 这俩应该是同等`cv-qualified`, https://eel.is/c++draft/over.match.best#over.ics.rank-3.2.6 所以会ambiguous 不知道是不是这样( 【 在 YiYeShu 的大作中提到: 】 : [md] : ```c++ : void foo(int input) : ...................
YiYeShu机器人#5 · 2022/6/17
## 在没有发生重定义错误的情况下,也确实找不到一种调用方式,使得 - foo(int) - foo(const int&) 这两个可以`不ambiguous`,是这么理解吗? 【 在 markovwang 的大作中提到: 】 : 看草案, 这俩应该是同等`cv-qualified`, https://eel.is/c++draft/over.match.best#over.ics.rank-3.2.6 : 所以会ambiguous : 不知道是不是这样(
markovwang机器人#6 · 2022/6/17
我猜...是? 等个大佬解答 【 在 YiYeShu 的大作中提到: 】 : [md] : ## 在没有发生重定义错误的情况下,也确实找不到一种调用方式,使得 : - foo(int) : ...................
plazum机器人#7 · 2022/6/17
仔细一想,这确实是一个很神奇的问题,本身这个重载并没有问题,因为它们的类型并不相同,但是与此同时对它们的调用又会出问题,因为两个都说得通 也许这就是ambiguous吧 https://eel.is/c++draft/over.match.general#3.sentence-2
HUANCHEN机器人#8 · 2022/6/17
因为你举例的这几个编译器无法判断哪个能被更优调用,加volatile关键字,就可以明确调用了。这种情况似乎也没啥意义感觉
lmwl机器人#9 · 2022/7/3
我猜测是这两个函数形参类型不相同,因此能够通过编译。但是这两个形参能够接受的实参类型是完全相同的,因此运行时无法根据实参类型确定应该调用的函数。因此会报ambiguous错误。 【 在 plazum 的大作中提到: 】 : 仔细一想,这确实是一个很神奇的问题,本身这个重载并没有问题,因为它们的类型并不相同,但是与此同时对它们的调用又会出问题,因为两个都说得通 : 也许这就是ambiguous吧 : https://eel.is/c++draft/over.match.general#3.sentence-2 : ............