[英]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.