Upload
seok-joon-yun
View
211
Download
4
Embed Size (px)
Citation preview
Effective Modern C++ StudyC++ Korea
Effective Modern C++ StudyC++ Korea3
widget.h
string vector gadget.h
Effective Modern C++ StudyC++ Korea4
widget.cpp
string vector gadget.h widget.h
Effective Modern C++ StudyC++ Korea5
조금더나은모양
Effective Modern C++ StudyC++ Korea7
Effective Modern C++ StudyC++ Korea8
header에서는 정의만할수있도록할것.
???
Effective Modern C++ StudyC++ Korea9
Effective Modern C++ StudyC++ Korea10
Effective Modern C++ StudyC++ Korea
template<typename T>void func(T&& param);
T가 아닌 param의 type
Effective Modern C++ StudyC++ Korea
template<typename T>void func(T&& param);
Widget widgetFactory(); // function returning rvalueWidget w; // a variable (an lvalue)func(w); // call func with lvalue; T deduced
// to be Widget&func(widgetFactory()); // call func with rvalue; T deduced
// to be Widget
Effective Modern C++ StudyC++ Korea
int x;auto& & rx = x; // error! can't declare reference to reference
Effective Modern C++ StudyC++ Korea
void func(Widget& && param);
void func(Widget& param);
Effective Modern C++ StudyC++ Korea
template<typename T>void f(T&& fParam){
someFunc(std::forward<T>(fParam)); // forward fParam to} // someFunc
template<typename T> T&& forward(typename remove_reference<T>::type& param){
return static_cast<T&&>(param);}
Effective Modern C++ StudyC++ Korea
Widget& && forward(typenameremove_reference<Widget&>::type& param){
return static_cast<Widget& &&>(param);}
Widget& && forward(Widget& param){
return static_cast<Widget& &&>(param);}
Widget& forward(Widget& param) {
return static_cast<Widget&>(param);}
Effective Modern C++ StudyC++ Korea
Widget&& forward(typenameremove_reference<Widget>::type& param){
return static_cast<Widget&&>(param);}
Widget&& forward(Widget& param){
return static_cast<Widget&&>(param);}
Effective Modern C++ StudyC++ Korea
template<typename T> T&& forward(remove_reference_t<T>& param) {
return static_cast<T&&>(param);}
Effective Modern C++ StudyC++ Korea
template<typename T>void func(T&& param);Widget widgetFactory(); // function returning rvalueWidget w; // a variable (an lvalue)func(w); // call func with lvalue; T deduced
// to be Widget&func(widgetFactory()); // call func with rvalue; T deduced
// to be Widget
Effective Modern C++ StudyC++ Korea
auto&& w1 = w;
Widget& && w1 = w;
auto&& w2 = widgetFactory();
Widget&& w2 = widgetFactory();
Effective Modern C++ StudyC++ Korea
template<typename T>class Widget {public:typedef T&& RvalueRefToT;
};
Widget<int&> w;
typedef int& && RvalueRefToT;
typedef int& RvalueRefToT;
Effective Modern C++ StudyC++ Korea
Effective Modern C++ StudyC++ Korea