autofuntionTimesMod1(int mod) {
int variableA = mod;
auto f = [variableA](int a, int b) { return a % variableA * b % variableA; };
return f;
}
voidtest1() {
cout <<"---test1---"<< endl;
int a =10, b =20, c =7;
auto times = funtionTimesMod1(c);
cout << times(a, b) << endl;
}
autofuntionTimesMod2(int mod) {
int variableA = mod;
auto f = [&variableA](int a, int b) { return a % variableA * b % variableA; };
return f;
}
voidtest2() {
cout <<"---test2---"<< endl;
int a =10, b =20, c =7;
auto times = funtionTimesMod2(c);
cout << times(a, b) << endl;
}
这段代码就已经不能正常工作了,它的输出是 0.
我们来看看为啥:
Process 15820 stopped
* thread #1, name = 'tmp', stop reason = step in
frame #0: 0x000000000040096b tmp`funtionTimesMod2(mod=7) at tmp.cpp:17
14 }
15
16 auto funtionTimesMod2(int mod) {
-> 17 int variableA = mod;
18 auto f = [&variableA](int a, int b) { return a % variableA * b % variableA; };
19 return f;
20 }
(lldb) p &variableA
(int *) $1 = 0x00007fffffffe120
Process 15820 stopped
* thread #1, name = 'tmp', stop reason = step over
frame #0: 0x00000000004009dc tmp`test2() at tmp.cpp:25
22 cout << "---test2---" << endl;
23 int a = 10, b = 20, c = 7;
24 auto times = funtionTimesMod2(c);
-> 25 cout << times(a, b) << endl;
26 }
27 auto funtionTimesMod3(int mod) {
28 int variableA = mod;
(lldb) p times
((anonymous class)) $2 = {
variableA = 0x00007fffffffe120
}
autofuntionTimesMod5(int mod) {
INT variableA;
cout <<"----A"<< endl;
variableA.num = mod;
cout <<"----B"<< endl;
classfunction {
const INT variableA;
public:
function(const INT &variableA) : variableA(variableA) {}
intoperator()(int a, int b) {
cout <<"----C"<< endl;
return a % variableA.num * b % variableA.num;
}
};
function f = function(variableA);
cout <<"----D"<< endl;
return f;
}
voidtest5() {
cout <<"---test5---"<< endl;
int a =10, b =20, c =7;
cout <<"----E"<< endl;
auto times = funtionTimesMod5(c);
cout <<"----F"<< endl;
cout << times(a, b) << endl;
cout <<"----G"<< endl;
}
实际上没必要纠结那么多,正常编译的话,其实是不会去先建一个右值的对象的.
代码
#include<bits/stdc++.h>usingnamespace std;
autofuntionTimesMod1(int mod) {
int variableA = mod;
auto f = [variableA](int a, int b) { return a % variableA * b % variableA; };
return f;
}
voidtest1() {
cout <<"---test1---"<< endl;
int a =10, b =20, c =7;
auto times = funtionTimesMod1(c);
cout << times(a, b) << endl;
}
autofuntionTimesMod2(int mod) {
int variableA = mod;
auto f = [&variableA](int a, int b) { return a % variableA * b % variableA; };
return f;
}
voidtest2() {
cout <<"---test2---"<< endl;
int a =10, b =20, c =7;
auto times = funtionTimesMod2(c);
cout << times(a, b) << endl;
}
classINT {
public:int num;
INT(const INT &i) : num(i.num) { cout <<"Copy constructor"<< endl; }
INT() =default;
};
autofuntionTimesMod3(int mod) {
INT variableA;
cout <<"----A"<< endl;
variableA.num = mod;
cout <<"----B"<< endl;
auto f = [variableA](int a, int b) {
cout <<"----C"<< endl;
return a % variableA.num * b % variableA.num;
};
cout <<"----D"<< endl;
return f;
}
voidtest3() {
cout <<"---test3---"<< endl;
int a =10, b =20, c =7;
cout <<"----E"<< endl;
auto times = funtionTimesMod3(c);
cout <<"----F"<< endl;
cout << times(a, b) << endl;
cout <<"----G"<< endl;
}
autofuntionTimesMod4(int mod) {
INT variableA;
cout <<"----A"<< endl;
variableA.num = mod;
cout <<"----B"<< endl;
classfunction {
const INT variableA;
public:
function(const INT &variableA) : variableA(variableA) {}
intoperator()(int a, int b) {
cout <<"----C"<< endl;
return a % variableA.num * b % variableA.num;
}
} f(variableA);
cout <<"----D"<< endl;
return f;
}
voidtest4() {
cout <<"---test4---"<< endl;
int a =10, b =20, c =7;
cout <<"----E"<< endl;
auto times = funtionTimesMod4(c);
cout <<"----F"<< endl;
cout << times(a, b) << endl;
cout <<"----G"<< endl;
}
autofuntionTimesMod5(int mod) {
INT variableA;
cout <<"----A"<< endl;
variableA.num = mod;
cout <<"----B"<< endl;
classfunction {
const INT variableA;
public:
function(const INT &variableA) : variableA(variableA) {}
intoperator()(int a, int b) {
cout <<"----C"<< endl;
return a % variableA.num * b % variableA.num;
}
};
function f = function(variableA);
cout <<"----D"<< endl;
return f;
}
voidtest5() {
cout <<"---test5---"<< endl;
int a =10, b =20, c =7;
cout <<"----E"<< endl;
auto times = funtionTimesMod5(c);
cout <<"----F"<< endl;
cout << times(a, b) << endl;
cout <<"----G"<< endl;
}
intmain() {
test1();
test2();
test3();
test4();
test5();
}