Мой вопрос касается следующего кода:
#include <type_traits>
#include <utility>
template <int First, int Last, typename Functor>
constexpr void static_for(Functor&& f)
{
if constexpr (First < Last)
{
f(std::integral_constant<int, First>{});
static_for<First + 1, Last, Functor>(std::forward<Functor>(f));
}
}
int main() {
static_for<1, 3>([](int /*i*/){
});
return 0;
}
Он выдает следующее предупреждение компилятора с MSVC (Visual Studio 2017 15.9.11, набор инструментов v141, / std: c ++ 17):
предупреждение C4100: 'f': формальный параметр без ссылки
Воспроизводится на Godbolt: https://godbolt.org/z/6gLDzu
Это ошибка компилятора?Я собирался сообщить об этом в Microsoft, но потом захотелось узнать мнение сообщества, может я что-то упустил?Код работает, и функтор вызывается правильное число раз, так что это не тот случай, когда компилятор неправильно компилирует код и ошибочно оптимизирует f
.