我发现提案措辞中没有提到 static_assert ,而 C++14 constexpr 函数确实允许 static_assert (详情见 cppreference: constexpr)。 它是否隐藏在这个新句子中(6.4.1 之后)?: 当constexpr if 语句出现在模板化实体中时,在封闭模板或通用 lambda 的实例化期间,不会实例化丢弃的语句。 从那里开始,我假设也禁止调用...
Code: #include <type_traits> template <typename T> int f() { if constexpr (std::is_same_v<T, int>) return 0; else static_assert(false, "shouldn't be compiled"); } int main() { } Compiler output: error C2338: static_assert failed: ‘shouldn’t be compiled’ ...
这里讨论的是一个完善的模板规则--与允许编译器诊断template<class> void f() { return 1; }. [te...
这里讨论的是一个完善的模板规则--与允许编译器诊断template<class> void f() { return 1; }. [te...
F() const noexcept requires(c_fVariantTypesContain<int> || c_fVariantTypesContain<long long>) { if constexpr (!c_fVariantTypesContain<long long>) { static_assert(c_fVariantTypesContain<int>); } } int main() { C<long, int> ci; C<long, long ...
if constexpr语句的引入使得编写模板代码变得更加简洁、清晰和易于维护。以前,编写类似的代码需要使用大量的类型traits和宏定义,例如: ``` template <typename T> void printTypeInfo() { static_assert(std::is_arithmetic<T>::value, "T must be an arithmetic type"); std::cout << "T is an arithmetic...
};template<intN>// (3)constexprintfactorial() {ifconstexpr (N>=2)returnN*factorial<N-1>();elsereturnN; }intmain(){ static_assert(Factorial<5>::value==factorial<5>());// (4)static_assert(Factorial<10>::value==factorial<10>());// (4)} ...
注意,if constexpr的使用并不限于模板函数,它可以用于任何函数中。它所需要的只是一个能够返回布尔值的编译期表达式。例如: intmain() {ifconstexpr (std::numeric_limits<char>::is_signed{ foo(42);//OK}else{ undeclared(42);//error if undeclared() not declaredstatic_assert(false,"unsigned");//al...
constexprautofoo(intx){ifconsteval{returnstd::array<int,x>{};}else{returnstd::array<int,1>{...
注意,if constexpr的使用并不限于模板函数,它可以用于任何函数中。它所需要的只是一个能够返回布尔值的编译期表达式。例如: intmain() {ifconstexpr (std::numeric_limits<char>::is_signed{ foo(42);//OK}else{ undeclared(42);//error if undeclared() not declaredstatic_assert(false,"unsigned");//al...