C++ 从非常量对象调用常量函数

C++ 从非常量对象调用常量函数,c++,function,constants,overloading,C++,Function,Constants,Overloading,我在使用const函数和const对象时遇到函数重载问题。 有人能解释为什么打印“constfooint&int”而不是“foointchar&”吗 以下代码 struct A { void foo(int i, char& c) { cout << "foo int char&" << endl;} void foo(int& i, int j) const { cout << "const foo int&

我在使用const函数和const对象时遇到函数重载问题。 有人能解释为什么打印“constfooint&int”而不是“foointchar&”吗 以下代码

struct A 
{
    void foo(int i, char& c) { cout << "foo int char&" << endl;}
    void foo(int& i, int j) const { cout << "const foo int& int" << endl;}
};

int main() {
    A a;
    const A const_a;
    int i = 1;
    char c = 'a';
    a.foo(i,i);
}
结构A { void foo(int-i,char&c){coutCause
void foo(int-i,int-j)
const是更好的匹配,其他函数需要int-to-char转换。

Cause
void foo(int-i,int-j)
const是更好的匹配,其他函数需要int-to-char转换

  • 将函数定义为常量意味着您无法更改对象中的成员变量
  • 常量对象无法调用非常量函数
  • 一个字符、一个短整数或一个整数位字段(无论是否有符号)或一个枚举类型的对象,可以在任何可能使用整数的表达式中使用。如果一个int可以表示原始类型的所有值,那么该值将转换为int;否则该值将转换为无符号int。此过程被调用整体推广
  • 将函数定义为常量意味着您无法更改对象中的成员变量
  • 常量对象无法调用非常量函数
  • 一个字符、一个短整数或一个整数位字段(无论是否有符号)或一个枚举类型的对象,可以在任何可能使用整数的表达式中使用。如果一个int可以表示原始类型的所有值,那么该值将转换为int;否则该值将转换为无符号int。此过程被调用整体推广

  • 一切都很清楚。您调用了一个具有两个int类型参数的函数。有两个候选函数。其中一个具有int类型的第一个参数和char引用的第二个参数。因此,要调用此函数,第二个参数应隐式转换为char类型&。但这是一个缩小转换,因为int高于char的秩。因此将创建一个临时对象,但临时对象只能与常量引用绑定。
    第二个函数不需要对其参数进行任何转换。因此它将被调用。

    一切都清楚。您使用两个int类型的参数调用了一个函数。有两个候选函数。第一个参数为int类型,第二个参数为对char的引用。因此,要调用此函数,第二个参数必须l将被隐式转换为类型char&。但这是一个缩小的转换,因为int的秩高于char的秩。因此将创建一个临时对象,但临时对象只能与常量引用绑定。

    第二个函数不需要对其参数进行任何转换。因此将调用它。

    不能使用int作为第二个参数调用第一个函数。
    char&
    不能绑定到
    int
    。这意味着只有第二个重载是可选的。

    不能使用int作为t调用第一个函数第二个参数。不能将
    char&
    绑定到
    int
    。这意味着只有第二个重载是可选的。

    因为不能将非常量左值ref绑定到
    char
    (即
    char&
    )对于类型为
    int
    的参数,第一个重载甚至不可行。因为对象a是const@piotruś
    a
    不是常量,
    const\u a
    是。不,它不是Pavel,我的错误,对象a本身不是常量,你可以对它调用非常量方法,但它是否完全忽略a不是常量的事实?就像你不能将非常量左值ref绑定到
    char
    (即
    char&
    )对于类型为
    int
    的参数,第一个重载甚至不可行。因为对象a是const@piotruś
    a
    不是常量,
    const\u a
    是。不,它不是Pavel,我的错误,对象a本身不是常量,你可以对它调用非常量方法,但它完全忽略了a不是常量的事实吗?是吗意思是
    a.foo(i,c)
    ?否则,为什么会有
    c
    ?您也在调用非常量对象。这似乎与您的问题不匹配。您的意思是
    a.foo(i,c)
    ?否则,为什么会有
    c
    ?您也在调用非常量对象。这似乎与您的问题不匹配。
    int
    不能由
    char&
    转换和绑定。虽然它可以转换为
    char
    ,但这将是一个右值,您不能将非常量左值引用绑定到它。@David Rodríguez-dribeas和我在我的帖子里写了什么?对不起,我错过了“五月[只有]绑定一个常量引用“@David Rodríguez-dribeas好吧,也许你会取消你的向下投票分数?我已经尝试过了,但投票被锁定。我确实随机选择了你的另一个答案并向上投票以进行补偿,但除非有更改,否则我无法从这个答案中删除向下投票。
    int
    无法转换并由
    char&
    。虽然可以将其转换为
    char
    ,但这将是一个右值,您不能将非常量左值引用绑定到它。@David Rodríguez-dribeas,我在我的帖子中写了什么?抱歉,我错过了“may[only]与常量引用绑定“@David Rodríguez-dribeas好吧,也许你会取消你的下一票?我已经尝试过了,但投票被锁定。我确实随机选择了你的另一个答案并向上投票以进行补偿,但除非有变化,否则我无法从这个答案中删除下一票。