use std::forward and remove the first overload