折叠表达式会短路吗?
Are fold expressions subject to short-circuiting?
在 C++17 中,折叠表达式在与&&
或||
作为运算符一起使用时是否会短路?如果是这样,在哪里指定?
是的,使用&&
或||
折叠表达式,因为运算符可能会短路,但通常需要注意的是,它发生在内置含义上,而不是重载运算符函数上。
折叠表达式的含义在 [temp.variadic]/9 中定义:
折叠表达式的实例化产生:
((E_1
opE_2)
op ...)
opE_N
对于一元左折,
E_1
op(
...操作(E_N_minus_1
opE_N))
对于一元右折,
(((E
opE_1)
opE_2)
op ...)
二元左折的opE_N
,以及
E_1
op(
...操作(E_N_minus_1
op(E_N
opE)))
对于二进制右折。在每种情况下,op都是折叠运算符,....
由于折叠表达式的实例化是包含运算符的表达式,因此运算符的所有正常规则(包括重载解析、计算顺序和内置运算符时的短路(都适用。
虽然@aschepler的答案是特别正确的,但我想重复我分享的关于另一个很好的技术点(元组破坏顺序(的人生教训:
如果你能为多个备选方案制定一个合理的论据,说明为什么该备选方案应该是标准规定的替代方案——那么你不应该假设其中任何一个是强制性的(即使其中一个恰好是(。
在折叠表达式和短路逻辑的上下文中 - 阅读可变参数模板化代码已经足够困难了,所以我会尝试为我的代码的读者省去关于折叠短路是否发生的令人头疼的问题......
如果你不能避免写and
和or
的折叠,至少要慷慨地评论短路行为。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 折叠表达式会短路吗?
- 如何使"短路评估"在"折叠表达式"中也可用?
- 当短路禁用常量表达式的计算时,是否允许在常量表达式中读取"一过一"指针
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算