如何定义 is_instantiable 类型特征?

How would an is_instantiable type trait be defined?

让我们考虑以下形式的类型特征:

template <class T>
struct is_instantiable
{
    static constexpr bool value = /* something */;
};

template <class T>
inline constexpr bool is_instantiable_v = is_instantiable<T>::value;

这将检测是否可以实例化 T 类型的实体。

目前标准库已经具有 is_constructible 等特征(但它需要构造对象的参数)。我在想:

目前不知道这样的东西有没有用? (如果您有任何有趣的用例,其中 is_constructible 受到限制,那就太棒了)。

我们反过来想一下。 我假设无法实例化的东西是指没有单个有效构造函数并且不是 in-built 类型的东西。 据我所知,你可以给任何东西一个类型的唯一方法,它的一个实例不能被构造,是通过强制转换(使用 reinterpret_cast?)。 在我看来,编写这样的代码是一个可怕的决定,但我认为它在理论上是可能发生的。

我想,用例是这样一种情况,您期望您正在处理的对象可能是由这样的转换生成的,并且您想知道是否是这种情况。

问编译器绝对是一个深奥的问题,我不知道如何有效地使用这些信息,也不知道如何实现这个特性。