Компилятор не предупреждает о потере точности?

В последнее время я экспериментировал с 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? Есть ли конкретная причина, по которой это не так?

6
задан R. Martinho Fernandes 12 April 2012 в 12:58
поделиться