Static Assertions in Failed Constexpr if Blocks
Introduction
constexpr if introduced in C 17 allows for more concise and efficient code. However, it also raises questions regarding the handling of static_assert statements in these if blocks.
Failure of Static Assertions in Non-taken Branches
The standard text states that static_assert statements are ill-formed in non-taken branches of constexpr if statements. This applies regardless of whether the condition is dependent or not.
Underlying Rule
This prohibition is based on a well-established rule for templates, which states that a program is ill-formed NDR (no diagnostic required) if no valid specialization can be generated for a template. Static_asserts with nondependent conditions that evaluate to false fall into this category.
Impact on Safety and Usefulness
This limitation puts a significant constraint on the safety and usefulness of constexpr if. Developers must be aware of any potential static_asserts that may be called within the non-taken branch of the if statement.
Example
The following code compiles without warnings but is considered ill-formed:
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>(); }
Scope of the Rule
The prohibition against static_asserts extends to call graphs, so any function called within the non-taken branch that may contain static_asserts is also prohibited.
Conclusion
The failure of static_asserts in non-taken branches of constexpr if statements highlights the need for careful consideration when using them within templates. Developers must ensure that any static_asserts with nondependent conditions that evaluate to false are not attempted in the non-taken branch of the if statement.
The above is the detailed content of What Happens to Static Assertions in Untaken `constexpr if` Branches?. For more information, please follow other related articles on the PHP Chinese website!