User Tools

Site Tools


cpp:forwardingbug

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
cpp/forwardingbug.txt · Last modified: by allspark