为什么允许这样做
Why is this allowed?
所以我知道不允许使用相同参数和名称的函数:
int a(int b) {
return b;
}
int a(int b) {
return b;
}
int main() {
int c = a(4);
}
上面的内容不会编译。但后来我开始思考,如果我通过了一个参考,一个通过了价值呢?
int a(int b) {
return b;
}
int a(int& b) {
return b;
}
int main() {
int c = a(4);
}
上面确实编译了,我想是因为你不能通过引用将4
传递给,所以它假设你想要第一个a
,这意味着编译器可以区分你想要调用哪个函数。如果我将main
更改为:
int main() {
int c = a(4);
a(c);
}
我认为它将无法编译,因为c
可以传递给任何一个函数,所以编译器不知道该调用哪个函数。
但是。。。这个?
int a(const int& b) {
return b;
}
int a(int& b) {
return b;
}
int main() {
int c = a(4);
a(c);
}
这是可编译的。为什么?我预计不会,因为c
可以传递给第一个和第二个a
。我有什么误解吗?
我的问题是,为什么这个(下面的代码(不编译,而最后一个编译?
int a(int b) {
return b;
}
int a(int& b) {
return b;
}
int main() {
int c = a(4);
a(c);
}
如果我是编译器,并且我可以根据参数匹配的程度来选择调用哪个函数,那么对于调用a(c)
,我可以从第一个和第二个中进行选择。在这个例子中,有什么原因不能选择第一个或第二个a
吗?
从函数调用中选择要使用的正确函数的过程称为重载解决方案。调用函数时,编译器会搜索所有具有该名称的函数(重载(,并将它们编译到重载集中。简单地说,通过从参数中选择需要尽可能少转换的函数来选择最佳匹配。
这是编译器从a(c)
中选择的两个函数:
int a(const int& b);
int a( int& b);
选择第二个过载是因为第一个过载需要const
资格。用于调用函数的变量c
是非const
,因此它与第二个重载完全匹配,并且可以绑定到非const
引用。
int a(const int& b) {
return b;
}
int a(int& b) {
return b;
}
int main() {
int c = a(4);
a(c);
}
当你用a(4)
调用它时,4是一个文本,只有你的版本使用const reference
才能绑定它,所以这就是被调用的版本。
现在,当您调用a(c)
时,您得到的c
是非常量int
,因此它更喜欢使用非常常量引用的函数。
相关文章:
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 为什么 arr[i++] 与 arr[i]++ 会这样做?
- ideone.com 为什么要这样做?
- std::字符串 's' 通过 '&s[0]' 转换为字符* - 如何/为什么这样做?
- 为什么在接受输入后循环退出时不会这样做
- 为什么我不能在未链接的 DLL 上调用方法,但可以这样做?C++
- 如何强制呼吁移动构造函数,为什么要这样做
- 为什么指针不能指向张贴增量,而可以这样做才能预先递增
- C++子字符串为什么这样做
- 为什么循环结束时不这样做?
- C++循环、作用域和堆栈(为什么这样做?
- C++为什么要这样做
- 为什么这样做?C中的字符指针
- 为什么static_cast不允许这样做
- 为什么编译器允许这样做
- 为什么内联模板专业化有帮助?我应该这样做吗
- C++中的字符串分配:为什么这样做
- 带有重载的显式模板函数专用化:为什么要这样做