http://en.cppreference.com/w/cpp/language/fold的网站提供了有关如何使用折叠概念的示例,并显示:
Note
If the expression used as init or as pack has an operator with precedence
below cast at the top level, it can be parenthesed:
template<typename ...Args>
int sum(Args&&... args) {
// return (args + ... + 1 * 2); // Error: operator with precedence below cast
return (args + ... + (1 * 2)); // OK
}
作为非英语母语者,我不会放弃这句话:
has an operator with precedence below cast at the top level
它实际上是什么意思,并且在示例中,它表示什么?你能帮忙解释一下吗?
非常感谢。
强制转换运算符((Typename)expr
)在C ++的运算符优先级规则中具有很高的优先级。很少有运营商具有更高的优先级。强制转换级别或更高优先级的运算符是非常特殊的运算,通常应用于单个表达式。
在表达式中args + ... + 1 * 2
,...
应用于左右两边的所有内容。但是“在右边”的真正含义是什么?它仅意味着+ 1
一部分,还是意味着+ 1 * 2
?
对于具有较高优先级的运算符,其意图很明显。例如,args + ... + func()
很明显,()
函数调用运算符适用于func
而不适用args + ... + func
。您不太可能希望后者,如果您这样做((args + ... + func)()
),则被迫显式使用括号。
但是,对于图表中低于3的优先级水平,事情变得更加让人难以理解。因此,C ++强制用户明确使用此优先级规则,而不是使用常规优先级规则。您可以拥有args + ... + (1 * 2)
或(args + ... + 1) * 2
。但是您必须清楚要哪个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句