Странное предупреждение компилятора о неиспользуемой переменной, это ошибка компилятора? - PullRequest
2 голосов
/ 21 апреля 2019

Мой вопрос касается следующего кода:

#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.

1 Ответ

3 голосов
/ 23 апреля 2019

В последней итерации ваш static_for() First + 1 равен Last.Это приводит к исчезновению тела функции и f не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...