??????????ú????????
????????????е?????????????????????????ú????????????????????????????????????????????????????????????????????????′???????main??????????????£?
void test_rvalue_rref(MyString &&str)
{
cout << "tmp object construct start" << endl;
MyString tmp = str;
cout << "tmp object construct finish" << endl;
}
int main() {
test_rvalue_rref(foo());
return 1;
}
// ??????
Constructor is called! this->_data: 28913680
Move Constructor is called! src: 28913680
DeConstructor is called!
tmp object construct start
Copy Constructor is called! src: 28913680 dst: 28913712
// ????????????????????????????????????????
tmp object construct finish
DeConstructor is called! this->_data: 28913712
DeConstructor is called! this->_data: 28913680
??????????????е?????????????????????????“Are you kidding me?????????????????????????????????????????”????????????ú????????????????
?????????????????????????????????????????????????????
??????????????????????????????????????????str???????????????????tmp???????????????????????????????????????tmp?????????????????????????????????str??????????????????????????????ú????и?????????????str??????????????????????????????????????????????????????????????????????????????tmp??????????治??????str??????????????std::move()??????str??????????????????????tmp???????????????????????????
???????????????????MyString b = foo()???????foo()?????????????????????????????????????b????????????????????
?????ù?????????????????????????????????ù????????????????д???????????????????
???????????
??????????????????????????????????????壬???????????????????????????????????????У??????????????л???????????????????????????????????????????????????У?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????const??????????????????????const????????????????const????????????????????????const???
??????????????????????????????????????
#include <iostream>
using namespace std;
void fun(int &) { cout << "lvalue ref" << endl; }
void fun(int &&) { cout << "rvalue ref" << endl; }
void fun(const int &) { cout << "const lvalue ref" << endl; }
void fun(const int &&) { cout << "const rvalue ref" << endl; }
template<typename T>
void PerfectForward(T t) { fun(t); }
int main()
{
PerfectForward(10);
// rvalue ref
int a;
PerfectForward(a);
// lvalue ref
PerfectForward(std::move(a));
// rvalue ref
const int b = 8;
PerfectForward(b);
// const lvalue ref
PerfectForward(std::move(b));
// const rvalue ref
return 0;
}
???????????????У???????????????PerfectForward??庯????????????????t??fun?????С??????????е?PerfectForward???????????????????????PerfectForward???????????????????????fun?????????void fun(int &)???????PerfectForward??????????β??????????????????????????????????????????????????????????????????????????????????????????????Ч???
????????????????PerfectForward??????????????????????????????????????ж?????????????????????????????PerfectForward????????????????????????????PerfectForward??????????????????????????????????????????????
??????????????const T &t??????????????????????????????const??????????????????κ?????????????????????????????const??????????????????const??????????????????const??????ú??const????????????????const??????
?????????????t???????const??????á?const????????????????????????
??????C++11???????????????????????????????????????????????????????????????????
??????????????????
????????????????????????????????????????????????
????typedef int& TR;
????int main()
????{
????int a = 1;
????int &b = a;
????int & &c = a;
????// ??????????????????????????????????
????TR &d = a;
????// ???typedef?????????????????????????
????return 1;
????}
??????C++?У?????????????ж??????????????????????????int & &c??????????????????????????????????????????????У??????????????????typedef??auto??????????????????????????????????????????????????????????????????????????????£????????????????ж?????????????????????????????????????á?????????????????????????????????????????????const????????й?????
????A& & => A&
????A& && => A&
????A&& & => A&
????A&& && => A&&
?????????????????????
??????????????????????????????????????????????庯??????庯???????????????????????????
????template<typename T>
????void foo(T&&);
?????????????????????????????????????????????????????????????????μ??????????????????????????????????????е????????????
???????foo????????????е?A???????????T???????A&???????????????????foo??????????A&??
???????foo????????????е?A???????????T???????A&&???????????????????foo??????????A&&??
??????????????????
?????????????????????????????????????????????????????????????????????????????д????????????????????
#include <iostream>
using namespace std;
void fun(int &) { cout << "lvalue ref" << endl; }
void fun(int &&) { cout << "rvalue ref" << endl; }
void fun(const int &) { cout << "const lvalue ref" << endl; }
void fun(const int &&) { cout << "const rvalue ref" << endl; }
//template<typename T>
//void PerfectForward(T t) { fun(t); }
// ??????????????????????е?????????????
template<typename T>
void PerfectForward(T &&t) { fun(static_cast<T &&>(t)); }
int main()
{
PerfectForward(10);
// rvalue ref???????t????????T &&
int a;
PerfectForward(a);
// lvalue ref???????t?????T &
PerfectForward(std::move(a));
// rvalue ref???????t?????T &&
const int b = 8;
PerfectForward(b);
// const lvalue ref???????t?????const T &
PerfectForward(std::move(b));
// const rvalue ref???????t?????const T &&
return 0;
}
??????????????????????????????????????????????????PerfectForward??庯???е?static_cast?????????static_cast?????????????????á????????μ???????????????????????????????const??????const?????
????// ??????????????????????????
????template<int && &&T>
????void PerfectForward(int && &&t) { fun(static_cast<int && &&>(t)); }
????// ?????????????ú?
????template<int &&T>
????void PerfectForward(int &&t) { fun(static_cast<int &&>(t)); }
????????????????з????????????е?????“????static_cast?????????????????????????”???????????????????????????ú?????????????????????????????????????????????????????????????????????????t?????????????????????????????????????fun?????д??????????????static_cast?????????????????
?????????C++11??????????????std::forward???????????????????????static_cast????????????????????std::forward??????汾??????
????template<typename T>
????void PerfectForward(T &&t) { fun(std::forward<T>(t)); }
??????????????std::move???????????????????????????????????std::forward????