C++ 如何使用if constexpr逻辑的静态断言?

C++ 如何使用if constexpr逻辑的静态断言?,c++,constexpr,if-constexpr,C++,Constexpr,If Constexpr,我想使用一些static\u assert检查,条件取决于一些constexpr逻辑。我认为这样的事情可能会奏效: intmain(){ constexpr int val=1; 如果constexpr(val==1){ 静态断言(val>0); } 如果constexpr(val==2){ 静态断言(val>1); } } 因为在编译时应该可以确定只检查第一个断言。然而,我得到: $ g++ -Wall -std=c++1z main.cpp main.cpp: In function ‘

我想使用一些
static\u assert
检查,条件取决于一些constexpr逻辑。我认为这样的事情可能会奏效:

intmain(){
constexpr int val=1;
如果constexpr(val==1){
静态断言(val>0);
}
如果constexpr(val==2){
静态断言(val>1);
}
}
因为在编译时应该可以确定只检查第一个断言。然而,我得到:

$ g++ -Wall -std=c++1z main.cpp 
main.cpp: In function ‘int main()’:
main.cpp:13:9: error: static assertion failed
         static_assert(val > 1);
         ^~~~~~~~~~~~~
对此我有点惊讶,我认为编译器足够聪明,在编译时理解不应该使用第二个if

所以我的问题是,你知道如何获得执行这种“constexpr条件静态断言”的模式吗

有关我的编译器版本的一些信息(如果有用):

$g++--版本
g++(Ubuntu 7.5.0-3ubuntu1~18.04)7.5.0

PS:当然,这是一个琐碎/荒谬的测试,但我对如何获得这样一个模式感兴趣,用于更复杂的情况。

如果您不是在模板中进行测试,那么它是不可能的。您的代码格式不正确,不需要诊断,因为:如果
val
依赖于模板参数,则此代码的唯一合理用例将开始工作。很难将非工作示例投影到实际案例。您对“constexpr条件静态断言”(当在模板之外时)的期望是什么?您的目标是在某个地方设置一个标志,然后根据该标志失败吗?为什么不
静态断言(val==1&&val>0)
?(即no
if constexpr
)好的,所以在指向的方向上读了一点之后,看起来这个“问题”的原因是分支没有真正被丢弃,即编译器仍然可以看到它,即使它在constexpr中,如果条件的计算结果为false,对吗?而真正看不到这个分支的唯一方法是使用一些模板元编程来代替?我对此感到惊讶,因为我想要的是“用constexpr-if替换一个#if宏”。但实际上,对于constexpr if来说,这似乎是不可能的。如果您不是在模板中执行此操作,那么它是不可能的。您的代码格式不正确,不需要诊断,因为:如果
val
依赖于模板参数,则此代码的唯一合理用例将开始工作。很难将非工作示例投影到实际案例。您对“constexpr条件静态断言”(当在模板之外时)的期望是什么?您的目标是在某个地方设置一个标志,然后根据该标志失败吗?为什么不
静态断言(val==1&&val>0)
?(即no
if constexpr
)好的,所以在指向的方向上读了一点之后,看起来这个“问题”的原因是分支没有真正被丢弃,即编译器仍然可以看到它,即使它在constexpr中,如果条件的计算结果为false,对吗?而真正看不到这个分支的唯一方法是使用一些模板元编程来代替?我对此感到惊讶,因为我想要的是“用constexpr-if替换一个#if宏”。但是,这似乎实际上不可能用constexpr if实现。