通过引用传递临时对象

时间:2018-09-27 03:14:59

标签: c++ arguments pass-by-reference temporary-objects

我有两节课: 圆点

Class Circle包含一个Dot,而Dot包含一个int。 Circle具有getDot()函数,而Dot具有lessThan(Dot&)函数。

我想按Dot内的int值对Circles数组elems []进行排序。如果我有一个Circle圆要与数组中的某个值进行比较,则基本上需要执行以下操作的行:

elems[0].getDot().lessThan(circ.getDot())

但是它无法编译...我可以通过临时解决此问题

Dot dt = circ.getDot()

并通过

elems[0].getDot().lessThan(dt)

但是这似乎是不必要的复制。有没有更有效的方法来解决这个问题?

不幸的是,我仅限于使用lessThan(dot&)进行比较,但是我可以修改它的内容。

编译器错误为: 错误:无效类型'Dot'的右值的非常量引用'Dot&'的初始化cout <

1 个答案:

答案 0 :(得分:1)

示例:

#include <vector>
#include <algorithm>

struct Dot
{
    Dot(int i) : value_(i) {}
    bool lessThan(Dot const& other) const
    {
        return value_ < other.value_;
    }

    int value_;
};

struct Circle
{
    Circle(Dot dot = Dot(0))
    : dot_(dot)
    {
    }

    const Dot& getDot() const { return dot_; }

    Dot dot_;
};


void sortCircles(std::vector<Circle>& circles)
{
    auto order = [](Circle const& l, Circle const& r)
    {
        return l.getDot().lessThan(r.getDot());
    };
    std::sort(circles.begin(), circles.end(), order);
}