在讲座之前,我正在重新研究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();或

有人可以阐明疑问吗?

谢谢。

最佳答案



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

例如:如果要在一个数字上对其进行测试而不创建命名的isOdd对象,则可以:

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

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

09-06 13:47