Тема: Проблема з шаблонами
Доброго дня. Недавно зіткнувся з досить дивною проблемою, пов'язаною з шаблонами. Створив окремий проект(Visual C++ 2015), щоб максимально загально її протестувати. Ось код:
#include <fstream>
#include <chrono>
using namespace std;
template<int Foo>
int g(int num)
{
    return f<Foo>(num);
}
template<int Foo>
int f(int num)
{
    if (num == 0)
        return Foo;
    return num + f<Foo>(num - 1);
}
int foo(void)
{
    f<1>(0); // Fix
}
int main(void)
{
    int a(0);
    ofstream out("log.txt");
    for (int i = 0; i < 5; ++i)
    {
        auto start = chrono::high_resolution_clock::now();
        for (int i = 0; i < 70000; ++i)
            a += g<1>(i);
        auto end = chrono::high_resolution_clock::now();
        out << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms elapsed " << a << '\n';
    }
    out.close();
    return 0;
}Проблема в тому, що якщо закоментувати рядок Fix у функції foo, швидкодія програми несподівано погіршується. Ось результат роботи програми(вміст log.txt) спочатку:
і після коментування рядка Fix:
Чому так відбувається? Наскільки я розумію, цей рядок не має впливати на роботу програми. Тут якась помилка в коді, чи це можуть бути особливості компілятора?


