如果条件正常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();
}
编辑: 似乎很多评论都与我的尝试有点不同。 我将引用@chris评论:
人们似乎忽视了这一点,所以这里有一个更好的例子 这很有用:
if constexpr (sizeof...(Ts) > 0 && is_integral_v<first_t<Ts...>>) { /* corresponding logic */ }
目前,这需要嵌套的constexpr ifs
目前似乎不可能,只有解决方法才是编写嵌套ifs。
答案 0 :(得分:4)
虽然可能无法评估条件,但您的程序无法编译,因为它无效 - 您无法比较string
和int
。如果将随机字符放在||
的第二个操作数中,则会得到类似的结果。
答案 1 :(得分:4)
表达式a > 2
需要在语法和语义上有效,否则,编译器不能排除它将返回||
运算符重载的某些类型。只有内置||
运算符具有短路行为。
但是,不会评估表达式a > 2
。您可以通过将std::string a
更改为int a
(未初始化)来验证这一点:对表达式a > 2
的评估会有未定义的行为,因此在常量中不允许评估a > 2
表达式。