在结构中调用重载运算符的约定?

时间:2017-04-11 10:15:26

标签: c++ g++

我在讲座之前重新审视了C ++中的结构概念,并编写了以下内容:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct isOdd{
  bool operator()(int x){
    return x%2;
  }
};

int main(){
 vector<int> v {3,4,2,1,65,2,4,65,2,9,8,5,7};

 int count = count_if(begin(v), end(v), isOdd());

 cout << "size of vector: " <<v.size() << endl;
 cout << "count of odds: " <<count << endl;
 return 0;
}

然后我意识到在调用结构函数isOdd时,我使用了语法:isOdd()但我只重写了()运算符。那么调用约定isOdd()是如何工作的,因为调用结构的函数就像: 结构::函数名称(); 或structure-object.functions-name();

有人可以详细说明疑问吗?

感谢。

1 个答案:

答案 0 :(得分:1)

  

然后我意识到在调用结构函数isOdd时,我有   使用语法:isOdd()但我只重写了()运算符。

不,您调用了隐式编译器生成的默认构造函数,从而创建了isOdd的临时对象。

例如:如果您想在单个数字上测试它而不创建命名的isOdd对象,您可以:

bool is_odd = isOdd()(4);
                 //^^ Creates a temporary object

优化编译器将忽略临时对象的创建,因为它既没有可观察的副作用也没有状态。