[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.