Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中每个函数都带有std::for_+;_C++_Functor - Fatal编程技术网

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::cout
std::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); // ???