Я обнаружил странную проблему в следующем фрагменте кода, которая привела к другим результатам.
Apple Clang (протестировано с 3.8.0 и 11.0) возвращает ожидаемое значение 10, но g cc (протестировано с 5.4 .0 и 9) возвращает 12.
#include <functional>
#include <iostream>
#include <vector>
int acc(std::function<int(int, int)> func, std::vector<int> operands) {
auto it = operands.begin();
int result = func(*it, *(++it)); // <-- causing issue, ++it not working as expected
if (operands.size() > 2) {
for (++it; it!=operands.end(); ++it) {
result = func(result, *it);
}
}
return result;
}
int main() {
std::cout << acc([](int a, int b){ return a+b; }, {3, 5, 2}) << std::endl;
}
Это можно воспроизвести, например, используя rextester.com .
Во время отладки я обнаружил, что приращение итератора ++it
похоже проблема. Замена на it+1
с последующим оператором it = it + 1
приводит к ожидаемому результату в обоих компиляторах. Но почему это компилируется по-разному среди компиляторов?