C++ C+中每个函数都带有std::for_+;
这是我从中复制的函子代码C++ C+中每个函数都带有std::for_+;,c++,functor,C++,Functor,这是我从中复制的函子代码 #包括 #包括 #包括 类EvenOddFunctor{ 整数偶数; int奇数; 公众: EvenOddFunctor():偶数(0),奇数(0){ void运算符()(int x){ 如果(x%2==0)偶数~+=x; else奇数_uz+=x; } int偶数之和()常数{返回偶数之和} int奇数总和()常量{返回奇数} }; int main(){ evenodd函子evenodd; int my_list[]={1,2,3,4,5,6,7,8,9,10};
#包括
#包括
#包括
类EvenOddFunctor{
整数偶数;
int奇数;
公众:
EvenOddFunctor():偶数(0),奇数(0){
void运算符()(int x){
如果(x%2==0)偶数~+=x;
else奇数_uz+=x;
}
int偶数之和()常数{返回偶数之和}
int奇数总和()常量{返回奇数}
};
int main(){
evenodd函子evenodd;
int my_list[]={1,2,3,4,5,6,7,8,9,10};
//?为什么分配
evenodd=std::对于每个(我的\u列表,
my_list+sizeof(my_list)/sizeof(my_list[0]),
偶数);/???
std::coutstd::for_每个
都按值接受函子,这意味着它修改了本地副本。赋值会将该本地副本取回,以便您可以实际查看修改后的版本
这一点很重要,因为你的函子有你感兴趣的可变状态,特别是偶数奇.偶数和偶数奇.奇数和让我们做一些实验
首先,试着不要分配它,看看会发生什么。在你尝试了它之后,如果你发现了它,就不需要再阅读了,所以你可以停下来
如果您无法理解,让我们进行第二次实验,并将main()
的相关部分更改如下:
const EvenOddFunctor evenodd_orig;
int my_list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// ??? why assign
auto evenodd = std::for_each(my_list,
my_list+sizeof(my_list)/sizeof(my_list[0]),
evenodd_orig); // ???
这里的关键部分是,您将一个常量对象传递给std::for_each
。这将进行编译,但如果std::for_each
按照您认为的方式工作,则不应进行编译
毕竟,operator()
不是一个常量方法,因此使用std::for_each
获取常量引用时,它应该不能调用可变的operator()
方法
这是因为本质上发生的事情是,std::for_each
生成一个你传递给它的函子的内部副本。它通过值而不是引用获取它的函子参数,你的函子最终修改了它的内部状态
这就是为什么std::for_each
在完成后返回functor对象的原因,这就是为什么需要存储它,因为传递给std::for_each
的原始对象尚未修改
const EvenOddFunctor evenodd_orig;
int my_list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// ??? why assign
auto evenodd = std::for_each(my_list,
my_list+sizeof(my_list)/sizeof(my_list[0]),
evenodd_orig); // ???