std::remove_const_t<std::remove_reference_t<T>>
на std::remove_cv<std::remove_reference<T>>
чтобы ещё volatile учитывался
В иной ситуации тебе в test первым параметром зайдет внезапно prvalue, для которого T будет чистым типом. Трансляция даже не остановится, т.к. std::remove_reference и std::remove_const созданы так, чтобы не замечать отсутствия того, что они призваны удалять.
в этом месте яб именно std::decay использовал
template<typename T>
void test(T && pointRef, std::remove_const_t<std::remove_reference_t<T>> * pointPtr) {}