以下代码在 clang++ 中工作,但在 g++ 中崩溃
#include<vector>
#include<iostream>
template<class Iterator>
double abs_sum(double current_sum, Iterator it, Iterator it_end){
if (it == it_end)
return current_sum;
return abs_sum(current_sum+std::abs(*it),++it,it_end);
}
int main(int argc, char** argv){
std::vector<double> values {1.0, 2.0,-5};
std::cout << abs_sum(0.0,values.begin(),values.end()) << std::endl;;
}
罪魁祸首原来是这一行:
return abs_sum(current_sum+std::abs(*it),++it,it_end);
在 clang 中,*it
在之前进行评估++it
,在 g++ 中则相反,导致迭代器在被取消引用之前增加。事实证明,评估函数参数的顺序是实现定义的。
我的问题是:我如何捕捉到这种类型的错误?理想情况下,当我不小心依赖于实现特定的细节时,我希望有一个错误或至少一个警告。
即使使用 -Wall,clang 和 gcc 都不会产生任何警告。