Следующий код работает в 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 ++ все наоборот, итератор должен быть увеличен до разыменования.Оказывается, порядок, в котором оцениваются аргументы функции, определяется реализацией.
Мой вопрос: как я могу отследить этот тип ошибки?В идеале я хочу иметь ошибку или, по крайней мере, предупреждение, когда случайно завису от деталей, специфичных для реализации.
Ни clang, ни gcc не выдают никаких предупреждений, даже с -Wall.