簡體   English   中英

為什么'operator>'需要const,而'operator <'不需要const?

[英]Why is const required for 'operator>' but not for 'operator<'?

考慮一下這段代碼:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator < (const MyStruct& other) {
        return (key < other.key);
    }
};

int main() {
    std::vector < MyStruct > vec;

    vec.push_back(MyStruct(2, "is"));
    vec.push_back(MyStruct(1, "this"));
    vec.push_back(MyStruct(4, "test"));
    vec.push_back(MyStruct(3, "a"));

    std::sort(vec.begin(), vec.end());

    for (const MyStruct& a : vec) {
        cout << a.key << ": " << a.stringValue << endl;
    }
}

它編譯得很好並且給出了預期的輸出。 但是,如果我嘗試按降序排序結構:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator > (const MyStruct& other) {
        return (key > other.key);
    }
};


int main() {
    std::vector < MyStruct > vec;

    vec.push_back(MyStruct(2, "is"));
    vec.push_back(MyStruct(1, "this"));
    vec.push_back(MyStruct(4, "test"));
    vec.push_back(MyStruct(3, "a"));

    std::sort(vec.begin(), vec.end(), greater<MyStruct>());

    for (const MyStruct& a : vec) {
        cout << a.key << ": " << a.stringValue << endl;
    }
}

這給了我一個錯誤。 這是完整的信息

/usr/include/c++/7.2.0/bits/stl_function.h:實例化'constexpr bool std :: greater <_Tp> :: operator()(const _Tp&,const _Tp&)const [with _Tp = MyStruct]' :
/usr/include/c++/7.2.0/bits/stl_function.h:376:20:錯誤:'operator>'不匹配(操作數類型是'const MyStruct'和'const MyStruct')
{return __x> __y; }

這似乎是因為這里的函數沒有const限定符:

bool operator > (const MyStruct& other) {
        return (key > other.key);
}

如果我添加它,

bool operator > (const MyStruct& other) const {
        return (key > other.key);
}

然后一切都很好。 為什么會這樣? 我不太熟悉運算符重載,所以我只是把它放在內存中我們需要添加const但是它仍然很奇怪為什么它適用於operator<沒有const

您會得到不同的行為,因為您實際上正在調用兩個不同的(重載) 排序函數。

在第一種情況下,您調用兩個參數std::sort ,它使用operator< direct。 由於向量元素的迭代器產生非const引用,因此它可以應用operator< just fine。

在第二種情況下,您使用的是std::sort的三個參數版本。 接受仿函數的那個​​。 你傳遞std::greater 該仿函數有一個operator()聲明如下:

constexpr bool operator()( const T& lhs, const T& rhs ) const;

請注意const引用。 它綁定了與const引用進行比較所需的元素。 所以你自己的operator>必須是const正確的。

如果你用std::less調用std::sort ,你的operator<將產生相同的錯誤,因為它不是const-correct。

使用std::sort(vec.begin(), vec.end())僅取決於operator< function。 它不要求該函數能夠使用const對象。

另一方面, std::greater要求函數能夠使用const對象。

如果使用std::less ,例如std::sort(vec.begin(), vec.end(), std::less<MyStruct>())您將看到類似的問題。


話雖如此, operator< function和operator>函數沒有理由是非const成員函數。 任何不修改成員數據的成員函數都應該成為const成員函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM