在C++20中,NTTP扩展了新类型,引入了术语“结构性”:
- 左值引用 - 整数类型 - 指针、成员指针和空指针 - 枚举类型 - 浮点数类型 - 类型中:所有基类和非静态数据成员都是公共的、不可变的,并且数据成员和基类的类型也必须是递归地“结构性”的(我猜),以及数组。
来源:https://en.cppreference.com/w/cpp/language/template_parameters 以下是一个无法正常工作的解决方案实现:
- 左值引用 - 整数类型 - 指针、成员指针和空指针 - 枚举类型 - 浮点数类型 - 类型中:所有基类和非静态数据成员都是公共的、不可变的,并且数据成员和基类的类型也必须是递归地“结构性”的(我猜),以及数组。
来源:https://en.cppreference.com/w/cpp/language/template_parameters 以下是一个无法正常工作的解决方案实现:
template <auto>
struct nttp_test {};
template <typename T, typename = void>
struct is_structural : std::false_type {};
template <typename T>
struct is_structural<T, std::void_t<nttp_test<T{}>>> : std::true_type {};
template <typename T>
inline constexpr bool is_structural_v = is_structural<T>::value;
我不确定那是否有效,但我担心默认初始化(也不能使用std::declval
)。
如果它无法实现,那么是否涉及编译器魔法?
T
与is_structural<T>
,会在编译时出现错误:https://godbolt.org/z/Ts9Gzz5aa(可能可以修复为`false`,但我无法做到) - undefinedT
。 - undefined