gpt4 book ai didi

c++ - 为什么这是允许的?

转载 作者:太空狗 更新时间:2023-10-29 23:40:16 24 4
gpt4 key购买 nike

所以我知道不允许具有相同参数和名称的函数:

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/

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