|
// See also: https://www.agner.org/optimize/calling_conventions.pdf |
|
template<class T> |
|
inline constexpr auto _select_param_type = [] |
|
{ |
|
if constexpr (std::is_trivially_copyable_v<T>) |
|
return _type_identity<T>(); |
|
else |
|
return std::add_rvalue_reference<T>(); |
|
}; |
Данная проверка используется для определения типа параметров внутренней функции в function_ref, при вызове которой передаются уже скопированные аргументы. is_trivially_copyable является избыточной, поскольку проверяет неиспользуемую в реализации функциональность. В этом случае достаточно проверять is_trivially_move_constructible и is_trivially_destructible, как например реализовано в gcc.
Также у них ограничивается размер типа. В текущей реализации возможны сценарии, когда большие trivially_copyable объекты избыточно копируются (к примеру, класс содержащий массив).
userver/third_party/function_backports/include/function_backports/functional_base.h
Lines 39 to 47 in 5461432
Данная проверка используется для определения типа параметров внутренней функции в
function_ref, при вызове которой передаются уже скопированные аргументы.is_trivially_copyableявляется избыточной, поскольку проверяет неиспользуемую в реализации функциональность. В этом случае достаточно проверятьis_trivially_move_constructibleиis_trivially_destructible, как например реализовано в gcc.Также у них ограничивается размер типа. В текущей реализации возможны сценарии, когда большие
trivially_copyableобъекты избыточно копируются (к примеру, класс содержащий массив).