more perfect forwarding.
rm remove_const_and_reference as we can use std::decay instead