关于c ++中二进制函数的参数

时间:2016-07-19 03:34:21

标签: c++ pointers reference const

当二元函数的参数应为const T &T &时,我感到困惑。

有人可以告诉我为什么sort(vec2.begin(), vec2.end(),cmp1());//error, why?错了,而sort(vec1.begin(), vec1.end(),cmp2());//correct是对的吗?

他们都有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?
}

2 个答案:

答案 0 :(得分:1)

const Node*不是const指针。它是指向const Node的指针。对许多人来说,这是一个混乱的来源。

您可以使用:

struct cmp1{
    bool operator ()(Node* p1, Node* p2) const
    {
        return p1->num_ > p2->num_;
    }
};

struct cmp1{
    bool operator ()(Node* const & p1, Node* const & p2) const
    {
        return p1->num_ > p2->num_;
    }
};

不要认为参数类型必须是const T &,而是认为它必须是T const &。然后,为什么const Node* &不是正确的类型以及为什么Node* const &是正确的类型将是有道理的。

答案 1 :(得分:1)

  

他们都有const T&amp;参数。

可能会让人感到困惑,但对于cmp1,参数类型(即const Node *&)不是const T&T==Node*},应为Node* const& 。注意const指针(Node* const)和指向const(const Node*)的指针之间的区别。

  

sort(vec2.begin(), vec2.end(),cmp1());//error, why?

元素类型为Node*,无法绑定到const Node* &。由于Node*const Node*不是同一类型,因此需要将其转换为const Node*,这将是一个临时的,并且不能绑定到非常量的左值引用