use of `memcpy` and `memset` with potentially non trivially copyable types
examples: (non exhaustive)
https://gitlab.com/libeigen/eigen/-/blob/1c013be2cc6a999268be2f25575cd6a07bd52c45/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h#L761
https://gitlab.com/libeigen/eigen/-/blob/1c013be2cc6a999268be2f25575cd6a07bd52c45/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h#L868
https://gitlab.com/libeigen/eigen/-/blob/1c013be2cc6a999268be2f25575cd6a07bd52c45/unsupported/Eigen/src/Skyline/SkylineStorage.h#L58-60
even if the types are trivially copyable, it doesn't mean that memset
sets them to the value zero. it's (almost always) true for primitive types, but this doesn't need to be true for user defined types.
for example, the exponent mpfr uses for 0.0
is (i think, usually) LONG_MIN + 1
so if a stack-allocated, trivially copyable wrapper were used, it could set the number to some non zero value (and cause a bunch of other issues since in that case mpfr expects the mantissa to have at least one non-zero bit)
possible solution: decide which implementation to use based on the value of std::is_arithmetic<Scalar>::value