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) {}
floppa322, А вот это уже интересный момент. В этом случае, да. выделить непрерывный кусок памяти и руками заполнять объекты - может быть даже имеет смысл. Это важное уточнение, его стоит дописать к вопросу.
В любом случае, такой уровень экономии на спичках имеет реальную ценность только после того, как все остальные способы оптимизации программы уже выполнены, потому что это недалеко от реализации на ассемблере и интринсинках.