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

标签 c++ reference constants overloading

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

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/

相关文章:

c++ - 引用临时成员

c++ - 开关盒错误 |的值在常量表达式中不可用

c++ - 直接用变量设置指针意味着什么?

c++ - glRotate 和我的矩阵::旋转

actionscript-3 - 类似于as3中指针的概念?

variables - 为什么我必须为 "const"变量指定类型而不是 "let"变量?

c++ - C++ 中的状态标志

c++ - brace-or-equal-initializers 初始化顺序

c++ - 模板构造函数怪异

c++ - 指针c++解释