forwarding bug
- snippet.cpp
#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;
}
Output
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