Actually, it's impossible (in pure C++).
Detecting whether a type has a default constructor is possible with SFINAE because it only involves the interface, but detecting whether it's trivial involves the implementation.
Therefore, a compiler must provide a specific intrinsic for this. You can find a list of intrinsics here, note that some are provided because they require a compiler intervention and others may be provided just to have a uniform set or streamline the Standard Library implementation.
The particular intrinsic you are looking for is either __has_trivial_constructor
which is also supported by gcc and MSVC according to the comments or __is_trivially_constructible
(Clang's specific). I must admit being slightly unsure of the former (what if the type has several constructors ?), the latter can be used as:
template <typename T>
struct has_trivial_default_constructor {
static bool const value = __is_trivially_constructible(T);
};