#include #include #include struct element { int v=0; }; std::ostream& operator<<(std::ostream &out, const element& el) { out << "ELEMENT : " << el.v << std::endl; return out; } template struct holder { What what; holder(What&& w) : what(w) { std::cout << __PRETTY_FUNCTION__ << std::endl; } }; template auto make_holder(T&& t) { std::cout << __PRETTY_FUNCTION__ << std::endl; return holder(std::forward(t)); // return holder>(std::forward(t)); } auto ret_holder1(void) { element vl{5}; auto h = make_holder(std::move(vl)); // use h return h; } auto ret_holder2(void) { element vl{23}; auto h = make_holder(vl); return h; } int main(void) { auto rh1 = ret_holder1(); auto rh2 = ret_holder2(); std::cout << "rh1: " << rh1.what; std::cout << "rh2: " << rh2.what; return 0; }