void f(Widget&& param); // rvalue reference
Widget&& var1 = Widget(); // rvalue reference
auto&& var2 = var1; // not rvalue reference
template<typename T> void f(std::vector<T>&& param); // rvalue reference
template<typename T> void f(T&& param); // not rvalue reference
- RValue reference
- RValue reference or LValue reference => 둘다 할 수 있으니 보편참조 라고 부르자
- 템플릿 매개변수
template<typename T>
void f(T&& param); // param is a universal reference
- auto 선언
auto&& var2 = var1; // var2 is a universal reference
template<typename T>
void f(T&& param); // param is a universal reference
Widget w;
f(w); // lvalue passed to f; param's type is Widget& (i.e., an lvalue reference)
f(std::move(w)); // rvalue passed to f; param's type is Widget&& (i.e., an rvalue reference)
void f(Widget&& param); // no type deduction param is an rvalue reference
Widget&& var1 = Widget(); // no type deduction var1 is an rvalue reference
template<typename T>
void f(std::vector<T>&& param); // param is an rvalue reference
template<typename T>
void f(const T&& param); // param is an rvalue referenc
template<class T, class Allocator = allocator<T>> // from C++ class vector Standards
{
public:
void push_back(T&& x);
…
};
template<class T, class Allocator = allocator<T>> // still from
class vector { // C++
public: // Standards
template <class... Args>
void emplace_back(Args&&... args);
…
};
http://en.cppreference.com/w/cpp/container/vector/emplace_back
auto timeFuncInvocation =
[](auto&& func, auto&&... params) // C++14
{
//start timer;
std::forward<decltype(func)>(func)( // invoke func
std::forward<decltype(params)>(params)... // on params
);
stop timer and record elapsed time;
};
- 코드를 정확하게 보는데 도움이 되고
- communication 에 도움이 된다 (이름이 있는 추상적 단어를 사용하므로)
- item 25/26 을 이해하는데 필수임(std::move / std::forward 의 사용)