Передача аргументов шаблона переменной в функцию переменной

Мы используем стороннюю библиотеку C, которая обеспечиваетprintf()-тигинальная функция,

void log(const char *format, ...);

По причинам, к которым не стоит обращаться, нам нужно ограничить скорость, с которой сообщения регистрируются, что-то вроде

void rate_limited_log(const char* format, ...)
{
    if (<not too fast>) {
         log(format, ...);
    }
}

К счастью, авторы библиотеки C знали, что они делают, и предоставили

void logv(const char* format, va_list ap);

поэтому написание вышеупомянутой функции является относительно простым делом. К сожалению однаковариадические функции не очень хорошо работают с встраиваниеми вот я придумал второе решение:

template <typename... T>
void rate_limited_log(const char* format, T&&... args)
{
    if (<not too fast>) {
        log(format, std::forward<T>(args)...);
    }
}

Это работает отлично и включает условие ограничения скорости, как мы хотели бы. Но у меня есть пара вопросов по этому поводу:

Является ли расширение пакета параметров в вызове переменной функции в стиле C, подобным этому, законной, четко определенной вещью, которую нужно сделать в C ++ 11, или нам просто повезло, что это работает?

Являются ли&&&nbsp;а такжеstd::forward&nbsp;на самом деле необходимо здесь, учитывая, что мы вызываем функцию C? Кажется, работает так же хорошо, если я используюconst T&или даже простоT&nbsp;по стоимости, с или безstd::forward.