为什么使用函数会给我一个错误?

时间:2013-07-04 20:52:20

标签: c++

如果一个变量直接传入,它可以正常工作,但是当我使用一个只返回变量的函数时,它就会停止工作。为什么会这样?

struct Edge {
    Point ap() const { return set[a]; }

    Point *set;
    int a;
}

function f(Point &p) {}

Edge e;

f(e.ap()); // Error: No matching function call to 'f'
f(e.set[e.a]); // Works fine

Point p = e.ap();
f(p); // Works fine

2 个答案:

答案 0 :(得分:3)

Point ap() const { ... }

ap按值返回,因为您没有在任何地方存储函数调用,所以执行此操作:

 f(e.ap()); 

将一个临时对象返回给f,该对象无法绑定到Point&类型。

你有很多选择,你可以......

  • 通过const引用返回Point::ap,即

     Point const& ap() { ... }
    
  • fconst&,按值或通过右值参考Point&&

  • 获取参数
  • 将函数调用的结果存储在变量中:

     Point p = e.ap();
     f(p);
    

答案 1 :(得分:2)

Point返回的ap是暂时的。为了将临时值作为参数传递,函数需要通过值const引用或右值引用来获取参数。

void function f(Point p) {}         // By value
void function f(const Point& p) {}  // By const reference
void function f(Point &&p) {}       // By rvalue reference