失败 Constexpr if 块中的静态断言
简介
constexpr if 在 C 17 中引入允许更简洁和高效的代码。但是,它也引发了有关这些 if 块中 static_assert 语句处理的问题。
未采用分支中静态断言失败
标准文本指出 static_assert constexpr if 语句的非采取分支中的语句格式不正确。无论条件是否依赖,这都适用。
基本规则
此禁令基于一个完善的模板规则,该规则规定程序如果无法为模板生成有效的专业化,则 NDR 格式错误(无需诊断)。具有评估为 false 的非依赖条件的 Static_asserts 属于这一类。
对安全性和实用性的影响
此限制对 constexpr 的安全性和实用性产生了重大限制,如果。开发人员必须注意 if 语句的非采取分支中可能调用的任何潜在 static_assert。
示例
以下代码编译时不会出现警告,但被认为格式不正确:
template< typename T> constexpr void other_library_foo(){ static_assert(std::is_same<T,int>::value); } template<class T> void g() { if constexpr (false) other_library_foo<T>(); }
范围规则
对 static_asserts 的禁止扩展到调用图,因此也禁止在非采取分支内调用可能包含 static_asserts 的任何函数。
结论
constexpr if 语句的非采用分支中 static_asserts 的失败突出显示了在模板中使用它们时需要仔细考虑。开发人员必须确保在 if 语句的非采取分支中不会尝试任何具有非依赖条件且计算结果为 false 的 static_asserts。
以上是未采用的'constexpr if”分支中的静态断言会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!