В последнее время я экспериментировал с C++11 и придумал следующую функцию суммирования:
template <typename T>
inline T sum(const std::function<T (int)> &f, int initial, int end)
{
T retval = 0;
for(int k = initial; k <= end; k++) {
retval += f(k);
}
return retval;
}
Идея состоит в том, что я могу передать лямбда-функцию и, таким образом, получить аккуратную и удобочитаемую функцию для математические суммы. Затем я попробовал следующее:
int main()
{
std::array<double, 2> arr1 = {{ 0.5, 1.5 }},
arr2 = {{ 1.5, -0.5 }};
auto n = sum<int>([&](int k) { return arr1[k]*arr2[k]; }, // Precision loss!
0, 1);
return 0;
}
Я скомпилировал это, используя g++ 4.6.3: g++ -Wall -pedantic -std=c++0x -o test main.cpp
и не выдает никаких предупреждений о потеря точности, которую я заметил в комментарии к исходному коду.
Здесь в значительной степени дано, что sum
— плохая вещь, но это может быть не так очевидно в более сложных контекстах. Должен ли компилятор не заметить, что возвращаемое значение моей лямбда-функции равно double
и предупредить меня, что я теряю точность при приведении к int
? Есть ли конкретная причина, по которой это не так?