At work-work, we try to stick to the forefront of C++ language development: C++20 all the time, C++23 as it shows up and is available in compilers. It’s a weird mix sometimes with a codebase that has a lengthy history. A while back I bumped into a for loop, tried to be clever and then hit limitations of Clang – and those limitations are sometimes relevant for KDE code that lands in FreeBSD, which is why I’m writing about it.
In C++23, you can zip the two arrays, so there's no need to declare an otherwise useless index variable:
int stdSumOfValidDataPoints(const MyData& data)
{
using namespace std;
auto&& r = ranges::views::zip_transform(
[](int data, bool valid){return data * valid;},
data.dataPoint,
data.dataPointIsValid
);
return accumulate(begin(r), end(r), 0);
}
Unfortunately, the current implementation of zip_transform in GCC doesn't understand that the output length is constant 8, so it does needless cmps every iteration to check if it should stop iterating. (Godbolt)
In C++23, you can zip the two arrays, so there's no need to declare an otherwise useless index variable:
Unfortunately, the current implementation of zip_transform in GCC doesn't understand that the output length is constant 8, so it does needless cmps every iteration to check if it should stop iterating. (Godbolt)
save