当二进制函数的参数应该是 const T &
或 T &
时,我感到很困惑。
谁能告诉我为什么 sort(vec2.begin(), vec2.end(),cmp1());//error, why?
是错误的,而 sort(vec1 .begin(), vec1.end(),cmp2());//对
是对的吗?
它们都有 const T &
参数。
谢谢!
struct Node{
Node(char ch, int num):ch_(ch), num_(num){ pnext_ = nullptr, pprev_ = nullptr; }
char ch_;
int num_;
Node *pnext_;
Node *pprev_;
// bool operator < (const Node &no) const { return num_ > no.num_; }//最小值优先
// bool operator > (const Node &no) const { return num_ < no.num_; }//最大值优先
};
struct cmp0{
bool operator () (Node * &p1, Node * &p2) const
{
return p1->num_ > p2->num_;
}
};
struct cmp1{
bool operator ()(const Node * &p1, const Node * &p2) const
{
return p1->num_ > p2->num_;
}
};
struct cmp2{
bool operator ()(const Node &p1, const Node &p2) const
{
return p1.num_ > p2.num_;
}
};
struct cmp3{
bool operator ()(Node &p1, Node &p2) const
{
return p1.num_ > p2.num_;
}
};
int main(int argc, char *argv[])
{
vector<Node> vec1;
vector<Node*> vec2;
sort(vec1.begin(), vec1.end(),cmp2());//correct
sort(vec1.begin(), vec1.end(), cmp3());//correct
sort(vec2.begin(), vec2.end(), cmp0());//correct
sort(vec2.begin(), vec2.end(),cmp1());//error, why?
}
最佳答案
They all have const T & arguments.
这可能会令人困惑,但是对于 cmp1
而言,参数类型(即 const Node *&
)不是 const T&
(与 T==Node*
),应该是Node* const&
。请注意常量指针 (Node* const
) 和指向常量的指针 (const Node*
) 之间的区别。
sort(vec2.begin(), vec2.end(),cmp1());//error, why?
元素类型为Node*
,无法绑定(bind)到const Node* &
。因为Node*
和const Node*
不是同一种类型,所以需要转为const Node*
,这将是一个临时的和不能绑定(bind)到对非常量的左值引用。
关于c++ - 关于c++中二元函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38449171/