失败的 Constexpr If 块中的静态断言:分析
在 C 17 中,constexpr if 语句提供了一种在编译时有条件执行代码的方法。然而,此类语句的 false 分支中 static_asserts 的行为引起了人们的关注。
该问题源于不允许实例化包含 static_assert 的模板的规则,该模板的条件是非依赖的且计算结果为 false ( [温度分辨率]/8)。此规则通过防止后续模板扩展中的未定义行为来确保类型安全。
在 constexpr if 语句的上下文中,这意味着 false 分支中的 static_asserts 如果其条件是非依赖的,则本质上是错误的。这是因为编译器无法在编译时确定是否可以为包含 static_assert 的模板生成任何有效的特化。
例如,以下代码格式错误:
void f() { if constexpr (false) static_assert(false); // ill-formed }
类似地, false 分支中的 constexpr 模板函数中的 static_asserts 也是格式错误的:
template<class T> void g() { if constexpr (false) static_assert(false); // ill-formed }
This规则扩展到对 constexpr 函数或调用 static_asserts 的模板函数的间接调用。 constexpr if 语句的 false 分支内的任何此类调用都是被禁止的,即使它们本身不包含 static_asserts。
此禁令限制了 constexpr if 语句的有用性,因为它要求开发人员仔细检查代码以确保false 分支中缺少 static_asserts。然而,在 constexpr if 语句中,具有至少一种类型的依赖条件的 static_asserts 仍然是允许的。
总之,失败的 constexpr if 块中 static_asserts 的格式错误是以下原因造成的:禁止模板包含具有计算结果为 false 的非依赖条件的 static_asserts 的一般规则。对于开发人员来说,遵守此规则对于避免未定义的行为并维护代码中的类型安全至关重要。
以上是为什么 Constexpr If 语句的 False 分支中的静态断言格式错误?的详细内容。更多信息请关注PHP中文网其他相关文章!