Make fixed-size Matrix and Array trivially copyable after C++20

Making them trivially copyable allows using std::memcpy() without undefined
behaviors.

Only Matrix and Array with trivially copyable DenseStorage are marked as
trivially copyable with an additional type trait.

As described in http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0848r3.html
it requires extremely verbose SFINAE to make the special member functions of
fixed-size Matrix and Array trivial, unless C++20 concepts are available to
simplify the selection of trivial special member functions given template
parameters. Therefore only make this feature available to compilers that support
C++20 P0848R3.

Fix #1855.
This commit is contained in:
Lingzhu Xiang
2022-01-07 19:04:35 +00:00
committed by David Tellenbach
parent c4b1dd2f6b
commit 47eac21072
11 changed files with 127 additions and 2 deletions

View File

@@ -42,6 +42,11 @@ template<typename T> struct evaluator_traits;
template< typename T> struct evaluator;
template<typename T> struct has_trivially_copyable_storage
{
static const bool value = false;
};
} // end namespace internal
template<typename T> struct NumTraits;

View File

@@ -1084,6 +1084,16 @@ namespace Eigen {
}
#endif
/**
* \internal
* \brief Macro for conditionally trivial special member functions for supporting trivially copyable types.
* This feature is officially known as C++20's P0848R3 and is enabled on supported compilers.
*/
#if (EIGEN_COMP_CXXVER >= 20) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_MSVC_STRICT)
#define EIGEN_COMP_HAS_P0848R3 1
#else
#define EIGEN_COMP_HAS_P0848R3 0
#endif
/**
* \internal