Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将if constexpr()与非const条件组合_C++_Visual Studio_C++17 - Fatal编程技术网

C++ 将if constexpr()与非const条件组合

C++ 将if constexpr()与非const条件组合,c++,visual-studio,c++17,C++,Visual Studio,C++17,我想说的是: if( constexpr( TEMPLATE_BOOL_VALUE ) || bOhterBoolValue ) { Foo(); } else { Baa(); } 对于这样的if语句,我通常使用预处理器宏: #define IF_COND if( constexpr( TEMPLATE_BOOL_VALUE ) || bOhterBoolValue ) IF_COND { Foo(); } else { Baa(); } 在Visu

我想说的是:

if( constexpr( TEMPLATE_BOOL_VALUE ) || bOhterBoolValue )
{
    Foo();
}
else
{
    Baa();
}

对于这样的if语句,我通常使用预处理器宏:

#define IF_COND    if( constexpr( TEMPLATE_BOOL_VALUE ) || bOhterBoolValue )

IF_COND
{
    Foo();
}
else
{
    Baa();
}
在Visual Studio 2017中,这是有效的(我本应该检查生成的代码,但没有检查生成的代码,但编译器接受了此语法)

在Visual Studio 2019中,现在有一个错误“C2760”,因为它只允许:

if constexpr( TEMPLATE_BOOL_VALUE )
{
    Foo();
}
else if( bOhterBoolValue )
{
    Foo();
}
else
{
    Baa();
}
有没有其他方法可以不用输入两次Foo()来完成这项工作

希望你能帮忙。我不想得到两个相同的案例。

因为
Foo()分支有效(即编译),无论
模板布尔值
是否为真,如果constexpr
,则无需使用


只需使用
if(TEMPLATE_BOOL_VALUE | | bOhterBoolValue)

就可以了。如果MSVC能证明条件总是错误的,它会很高兴地删除分支。谢谢!这就是我具体问题的解决方案。但是如果const部分变得更复杂,编译器可能会生成代码。在这个简单的例子中,你是对的。我想知道是否有一种将constexpr()与其他值组合的通用方法。@AntonF。“编译器可能会生成代码”我希望现代编译器足够聪明,不会这样做。“我不会担心的。”HolyBlackCat这是常识,但遗憾的是,并非所有情况下都是如此。我在这方面有一些经验。在某个深度,优化停止。Maby VS2019比它的前身要好,但在非常复杂的情况下总是有局限性的。@AntonF。在这些情况下,请事先将要检查的值指定给
constexpr
变量。这样,它的值就需要在编译时可用。如果您的编译器仍然生成运行时代码,则可能需要向MSVC报告错误。If(constrexpr(TEMPLATE_BOOL_VALUE)| | whatever)
是否实际编译?如果constrexpr实现,您认为
会实现什么?“我通常对此类If语句使用预处理器宏。”迈克·博克兰:在某些特殊情况下,我会使用这样的宏。一般来说,我不知道。“通常”只是在这种情况下。