我有一个类型TimeDuration
。现在是文字类型我可以将它用作非类型模板参数。这种用法与类型定义相距甚远(编译方面),因此如果有人修改TimeDuration
这样它就不再是字面意思了,很久以后才会注意到。
所以我把static_assert(std::is_literal_type_v<TimeDuration>);
就在类定义之后。然而,is_literal_type
在c++20中被删除。我可以用什么来代替这个?
我知道关于C++17 中已弃用 std::is_literal_type,但答案基本上说我的问题不存在。
有一种非常简单的方法可以获取有关类型是否适合在非类型模板参数中使用的编译错误:在 NTTP 中使用它。如果不合适,编译器会抱怨。
您可以轻松地在某处编写一个小模板,并使用您的类型显式实例化它。就像是:
template<auto val> struct checker{};
template struct checker<MyType(/*insert params for constexpr function here*/)>;
is_literal_type
无论如何都是不合适的(这就是它消失的原因),因为作为文字类型并不像 C++20 的用户定义的 NTTP 规则那么严格。是的,用户定义的 NTTP 必须是文字类型,但它还必须具有许多其他品质。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)