这里讨论的是一个完善的模板规则--与允许编译器诊断template<class> void f() { return 1; }. [te...
这里讨论的是一个完善的模板规则--与允许编译器诊断template<class> void f() { return 1; }. [te...
P0292R1 constexpr if has been included ,在 C++17 的轨道上。它似乎很有用(并且可以替代 SFINAE 的使用),但是关于 static_assert 不 正确 的评论让我感到害怕:
...3.整个函数的函数体中,不能出现非常量表达式之外的语句(using 指令,typedef语句以及static_assert断言,return语句除外) 代码如下: #include using namespace std; //errorconstexprint func1() {constexprint a = 100;constexprint b = 10;...() { using myType = int;constexprmyType a = 100;...
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’ Expected compiler ...
template <typename T> void f() { if constexpr (std::is_arithmetic_v<T>) // ... else static_assert(false, "必须是算术类型"); // 非良构:该语句对于所有 T 都非法 } 对这种万应语句的常用变通方案,是一条始终为 false 的类型待决表达式: template<class T> struct dependent_false : std:...
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...
voidf(constexprintx){// x 必定是编译期常量static_assert(x==5);} 这个可能比较符合你的要求. ...
#include<type_traits>template<typenameT>constexprintfunc(T x){ifconstexpr(std::is_same_v<T,int>){returnx; }else{static_assert((sizeof(T),false),"Bad template argument");return0; } } Or you can make a dependent expression which is always false: ...
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<lon...