C++11可变参数模板输出异常及运算符优先级疑问
问题一:成对求和结果为3而非6的原因
咱们先揪出第一个问题的核心:你的基例返回类型写错了!
看这段代码:
template<typename T> bool pairwise_sum(const T&first, const T&second) { return (first + second); }
基例的返回类型是bool,但你实际需要返回的是求和后的数值类型T。当你传入1,1,2,2时,递归过程是这样的:
- 外层调用
pairwise_sum(1,1,2,2),先算出1+1=2,接着递归调用pairwise_sum(2,2) - 进入基例后,
2+2=4,但因为返回类型是bool,非零值会被强制转换成true(对应整数1) - 外层最终计算
2 + 1 = 3,这就是你得到3的原因
修复起来很简单,把基例的返回类型改成T就行:
template<typename T> T pairwise_sum(const T&first, const T&second) { return (first + second); }
改完之后,基例会返回正确的求和值,最终结果就是(1+1)+(2+2)=6,完全符合预期。
问题二:运算符优先级的影响
针对第二个疑问,加不加括号确实会产生天差地别的结果,因为乘法*的优先级本来就高于加法+。
看你写的正确版本:
return 10 * (first + second) + pairwise_sum_10fold(args...);
这里的括号明确让编译器先计算first+second,再把这个和乘以10,最后加上递归的结果——这完全符合你“每一对的和放大10倍后累加”的逻辑。
要是去掉括号写成这样:
return 10 * first + second + pairwise_sum_10fold(args...);
根据运算符优先级,编译器会先算10*first,然后依次加second和递归结果,这就变成了(10*first) + second + ...,彻底偏离了你的预期。
举个实际例子,传入1,1,2,2:
- 加括号的情况:
10*(1+1) + 10*(2+2) = 20 + 40 = 60 - 不加括号的情况:
10*1 +1 +10*2 +2 =10+1+20+2=33
所以这个场景下,括号是必须的,用来锁定运算顺序,保证逻辑正确。
内容的提问来源于stack exchange,提问作者user888270
相关产品推荐
相关产品推荐

