返回信息流```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`函数进行调用?
这是一条镜像帖。来源:北邮人论坛 / cpp / #102009同步于 2022/6/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【问题】函数重载【int】【const int&】
YiYeShu
2022/6/16镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 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`而能正确的被区分开。
看草案, 这俩应该是同等`cv-qualified`, https://eel.is/c++draft/over.match.best#over.ics.rank-3.2.6
所以会ambiguous
不知道是不是这样(
【 在 YiYeShu 的大作中提到: 】
: [md]
: ```c++
: void foo(int input)
: ...................
## 在没有发生重定义错误的情况下,也确实找不到一种调用方式,使得
- foo(int)
- foo(const int&)
这两个可以`不ambiguous`,是这么理解吗?
【 在 markovwang 的大作中提到: 】
: 看草案, 这俩应该是同等`cv-qualified`, https://eel.is/c++draft/over.match.best#over.ics.rank-3.2.6
: 所以会ambiguous
: 不知道是不是这样(
我猜...是? 等个大佬解答
【 在 YiYeShu 的大作中提到: 】
: [md]
: ## 在没有发生重定义错误的情况下,也确实找不到一种调用方式,使得
: - foo(int)
: ...................
仔细一想,这确实是一个很神奇的问题,本身这个重载并没有问题,因为它们的类型并不相同,但是与此同时对它们的调用又会出问题,因为两个都说得通
也许这就是ambiguous吧
https://eel.is/c++draft/over.match.general#3.sentence-2
我猜测是这两个函数形参类型不相同,因此能够通过编译。但是这两个形参能够接受的实参类型是完全相同的,因此运行时无法根据实参类型确定应该调用的函数。因此会报ambiguous错误。
【 在 plazum 的大作中提到: 】
: 仔细一想,这确实是一个很神奇的问题,本身这个重载并没有问题,因为它们的类型并不相同,但是与此同时对它们的调用又会出问题,因为两个都说得通
: 也许这就是ambiguous吧
: https://eel.is/c++draft/over.match.general#3.sentence-2
: ............