C++17中折叠表达式使用&&或||时是否支持短路求值?规范依据?
关于C++折叠表达式的短路求值问题
先直接给结论:不是所有折叠表达式都遵循短路求值规则——只有当折叠操作符是&&或||时,才会遵循短路求值;使用其他操作符(比如+、*、,等)的折叠表达式会完整求值所有元素。
针对你第二个问题:在C++17标准中,使用&&或||的折叠表达式确实遵循短路求值规则。
标准中的明确规定
在C17官方标准(文档编号N4659,即C17的最终草案,与正式标准内容完全一致)的**[expr.fold]**章节下,明确说明了这一点:
折叠表达式的求值顺序由操作符的性质决定。对于逻辑与(
&&)、逻辑或(||)以及逗号操作符的折叠表达式,求值是按顺序进行的(左折叠从左到右,右折叠从右到左),并且遵循对应操作符的短路求值规则——一旦可以确定最终结果,后续的元素求值会被立即终止。
举个简单的代码例子验证这个行为:
#include <iostream> bool check(int n) { std::cout << "Checking " << n << "\n"; return n != 0; } int main() { // 左折叠 &&,第一个元素返回false,后续调用直接被短路 auto result = (check(0) && ... && check(3)); std::cout << "Final result: " << std::boolalpha << result << "\n"; return 0; }
运行这段代码只会输出Checking 0和Final result: false,说明后面的check(1)、check(2)、check(3)都没有被执行,完全符合短路求值的预期。
内容的提问来源于stack exchange,提问作者Sydius
相关产品推荐
相关产品推荐

