Actually change that to:
~unaligned(void) {
if constexpr ( !std::is_trivially_destructible<T> ) {
alignas(T) std::byte buf[ __datasizeof(T) ];
T &tmp = *static_cast<T*>(static_cast<void*>(buf));
std::memcpy(&tmp, &_m_data.front(), __datasizeof(T));
tmp.~T();
}
}
And then add wording to the standard something like:
"An implementation of a destructor shall be considered trivial if, after expanding an 'if constexpr', the body of the destructor is empty"
No, C++ never cracks open a curly-braced body to "inspect" it like that (because, in general, the Halting Problem).
Fortunately for you, C++20 already supports conditionally trivial special member functions — you've even used that feature in your Godbolt already!
~unaligned() requires std::is_trivially_destructible<T> = default;
~unaligned() { alignas(T) std::byte ~~~~ tmp.~T(); }
The constrained destructor will be preferred by overload resolution when [that is, for types for which] its constraint is satisfied.
The key term for which to Ctrl+F the standard is "eligible destructor."
HTH,
Arthur