结构中的重载函数调用operator()/参数会发生什么?

时间:2016-10-19 13:18:06

标签: c++

您好,非常感谢!

我正在std::unique使用erasestd::vector。要检查唯一性,我调用结构的布尔函数。因为我想使用预定义的容差,所以我尝试添加一个传递所需值的构造函数。它有效,但我不知道为什么。

std::vector<std::pair<int,double> > myVec;

struct Check{

  double tol_ = 0.0;
  Check(double tol) : tol_(tol)
  {        
  }

  bool operator()(const std::pair<int,double> &a, 
                  const std::pair<int,double> &b)
  {
    return fabs(a.second-b.second) < tol_;
  }
};

// fill vector
...

// remove duplicates
myVec.erase(std::unique(myVec.begin(), myVec.end(), Check(0.1)), myVec.end());

这在某种程度上是合理的做法吗?我对unique感到困惑。到达此函数时,使用容差构造结构Check。 接下来unique多次调用这个结构来比较矢量元素,将它们作为参考传递?

感谢您的努力!

1 个答案:

答案 0 :(得分:2)

在调用Check(0.1)std::unique执行的操作是创建临时对象时会发生什么。此临时对象的生命周期将为完整表达式的结尾。

临时对象像任何其他对象一样传递给std::unique函数。这是有效的,因为该参数是一个模板化的参数,并且可以具有与其使用相匹配的任何类型。

简而言之,对std::unique的调用大致相当于以下内容:

// Enter new nested local scope
{
    Check temporary_object(0.1);  // Create object
    std::unique(..., temporary_object);
}
// Left nested scope, the `temporary_object` is destructed