所以我知道不允许具有相同参数和名称的函数:
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
,因此它非常适合第二个重载,并且可以绑定(bind)到非 const
引用。
关于c++ - 为什么这是允许的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22547973/