C++ 重载==运算符时,常量参数是必需的吗?

C++ 重载==运算符时,常量参数是必需的吗?,c++,operator-overloading,C++,Operator Overloading,在第一次代码提取中,所有参数都是const,代码编译成功。在第二个代码提取中,参数为non-const,代码异常失败,返回消息: 可能是'bool operator==(Date&,Date&')'[使用参数相关查找找到] 这是因为==运算符必须采用常量参数吗 首先 第二 int serialDate() { return m_date.serialNumber(); } friend bool operator == (Date& a, Date& b) {

在第一次代码提取中,所有参数都是
const
,代码编译成功。在第二个代码提取中,参数为non-
const
,代码异常失败,返回消息:

可能是'bool operator==(Date&,Date&')'[使用参数相关查找找到]

这是因为
==
运算符必须采用
常量
参数吗

首先

第二

int serialDate()
{
    return m_date.serialNumber(); 
}

friend bool operator == (Date& a, Date& b)
{
    return (a.serialDate() == b.serialDate());
}

根据要求,这里是我的第二个代码片段的代码,它通过(非常量)引用传递给比较例程的日期对象

代码中有我添加的内容来填补缺失的部分。代码编译、运行并生成预期的输出

#include <iostream>

using std::cout;

namespace {

struct SerialNumber {
    int d;
    int serialNumber() { return d; }
};

struct Date {
    SerialNumber m_date;

    int serialDate() {
        return m_date.serialNumber();
    }

    friend bool operator==(Date& a, Date& b) {
        return a.serialDate() == b.serialDate();
    }
};

} // anon

int main() {
    auto d1 = Date{{5}};
    auto d2 = Date{{5}};

    if (d1 == d2) {
        cout << "These are the same date.\n";
    } else {
        cout << "These are different dates.\n";
    }
}
#包括
使用std::cout;
名称空间{
结构序列号{
int d;
int serialNumber(){return d;}
};
结构日期{
序号m_日期;
int serialDate(){
返回m_date.serialNumber();
}
friend bool运算符==(日期和a、日期和b){
返回a.serialDate()==b.serialDate();
}
};
}//阿农
int main(){
自动d1=日期{5};
自动d2=日期{5};
如果(d1==d2){

这不是语言所要求的,但它是惯例所要求的。为什么你会禁止与
const
实例进行比较?我的问题是,为什么你会禁止与非const引用进行比较?为什么第二个代码提取无法编译?@Marco我的问题是,为什么你不想标记参数const这里的概念是,您告诉世界,在进行比较时,您承诺不会更改正在比较的值。@Marco很难说为什么它在没有更多信息的情况下无法编译。根据代码和错误消息,听起来您好像在尝试使用
操作符比较
常量
实例==(Date&,Date&);
@Marco注意:没有常量值会绑定到常量参数。谢谢。我使用的代码与此非常相似。我将深入研究Date成员类。
#include <iostream>

using std::cout;

namespace {

struct SerialNumber {
    int d;
    int serialNumber() { return d; }
};

struct Date {
    SerialNumber m_date;

    int serialDate() {
        return m_date.serialNumber();
    }

    friend bool operator==(Date& a, Date& b) {
        return a.serialDate() == b.serialDate();
    }
};

} // anon

int main() {
    auto d1 = Date{{5}};
    auto d2 = Date{{5}};

    if (d1 == d2) {
        cout << "These are the same date.\n";
    } else {
        cout << "These are different dates.\n";
    }
}