Некоторые проверки избыточны:
Все основные типы и типы указателей также тривиальны. Следует признать, что некоторые фундаментальные типы могут быть больше, чем void*
(указатели на функцию-член / член, хотя они, вероятно, больше, не распознаются std::is_pointer
).
Это чрезмерное ограничение:
Достаточно быть тривиально копируемым, тривиальная конструкция по умолчанию не имеет значения. Можно даже сказать, что одной лишь тривиальной разрушаемости достаточно.
template <class T>
using prefer_copy = std::bool_constant<std::is_trivially_copyable<T>() && sizeof(T) <= sizeof(std::max_align_t)>;
Вы будете писать реализацию дважды
Если ваш компилятор разрешает принудительное встраивание (не стандартизировано, но почти каждый компилятор допускает это каким-либо образом), вы можете делегировать эту единственную общую реализацию и получить ее встроенную.