Examples of std::forward
I've seen use it when passing the argument to another function, such as this common one from cppreference:
template<class T>
void wrapper(T&& arg)
{
// arg is always lvalue
foo(std::forward<T>(arg)); // Forward as lvalue or as rvalue, depending on T
}
It also has a more complicated case:
if a wrapper does not just forward its argument, but calls a member function on the argument, and forwards its result
// transforming wrapper
template<class T>
void wrapper(T&& arg)
{
foo(forward<decltype(forward<T>(arg).get())>(forward<T>(arg).get()));
}
But what happens when I only call the member function without passing the result to another function?
template<class T>
auto wrapper(T&& arg)
{
return std::forward<T>(arg).get();
}
In this case, is it useful to call std::forward
or is arg.get()
equivalent? Or does it depend on T
?
EDIT: I've found a case where they are not equivalent;
#include <iostream>
struct A {
int get() & {
return 0;
}
int get() && {
return 1;
}
};
template<class T>
auto wrapper_fwd(T&& arg)
{
return std::forward<T>(arg).get();
}
template<class T>
auto wrapper_no(T&& arg)
{
return arg.get();
}
wrapper_fwd(A{})
returns 1
and wrapper_no(A{})
returns 0
.
But in my actual use-case arg
is a lambda and operator()
isn't overloaded like this. Is there still a possible difference?