逻辑短路不能用于if-constexpr吗?

时间:2017-10-19 16:06:25

标签: c++ if-statement c++17 constexpr

如果条件正常if,则短路有效。

然而,if-constexpr尝试短路并不起作用:

#include <iostream>
template <typename ... Args>
void foo(Args... args) {
    std::string a; 
    // for the call of foo, sizeof...(args) = 0, so a > 2 shouldn't be evaluated.
    if constexpr (sizeof...(args) == 0 || a > 2) {
        std::cout << "ASD" << '\n';
    }
}

int main() {
   foo();
}

Demo

编辑: 似乎很多评论都与我的尝试有点不同。 我将引用@chris评论:

  

人们似乎忽视了这一点,所以这里有一个更好的例子   这很有用:

if constexpr (sizeof...(Ts) > 0 && is_integral_v<first_t<Ts...>>) { 
    /* corresponding logic */ 
}
     

目前,这需要嵌套的constexpr ifs

目前似乎不可能,只有解决方法才是编写嵌套ifs。

2 个答案:

答案 0 :(得分:4)

虽然可能无法评估条件,但您的程序无法编译,因为它无效 - 您无法比较stringint。如果将随机字符放在||的第二个操作数中,则会得到类似的结果。

答案 1 :(得分:4)

表达式a > 2需要在语法和语义上有效,否则,编译器不能排除它将返回||运算符重载的某些类型。只有内置||运算符具有短路行为。

但是,不会评估表达式a > 2。您可以通过将std::string a更改为int a(未初始化)来验证这一点:对表达式a > 2的评估会有未定义的行为,因此在常量中不允许评估a > 2表达式。