#include <utility> #include <ostream> #include <iostream> struct element { int v=0; }; std::ostream& operator<<(std::ostream &out, const element& el) { out << "ELEMENT : " << el.v << std::endl; return out; } template<class What> struct holder { What what; holder(What&& w) : what(w) { std::cout << __PRETTY_FUNCTION__ << std::endl; } }; template<class T> auto make_holder(T&& t) { std::cout << __PRETTY_FUNCTION__ << std::endl; return holder<T>(std::forward<T>(t)); // return holder<std::remove_reference_t<T>>(std::forward<T>(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; }
auto make_holder(T&&) [with T = element] holder<What>::holder(What&&) [with What = element] auto make_holder(T&&) [with T = element&] holder<What>::holder(What&&) [with What = element&] rh1: ELEMENT : 5 rh2: ELEMENT : 21953