[bugfix] Fix Dune::Hybrid::Impl::Id
There's a bug in the current implementation of Dune::Hybrid::Impl::Id
.
Trying to do 'perfect forwarding' using
template<class T>
constexpr decltype(auto) foo()(T&& x) {
return std::forward<T>(x);
}
leads to undefined behaviour if you pass an r-value
to the function. Then decltype(auto)
would be
deduced to be an r-value reference such that in
auto&& bar = foo(expression());
bar
would be bound to a temporary which is no longer
alive because there's no lifetime prolongation. The correct
version is
template<class T>
constexpr T foo()(T&& x) {
return std::forward<T>(x);
}
When passed an r-value of the raw type E
then T
is
deduced to be E
such that we move the temporary into
the new value bar
. If we pass an l-value of the raw
type E
, then T
is deduced to be either T&
or
const T&
such that we properly return the reference.