Passando argumentos do Modelo Variadic para uma Função Variadic

Estamos usando uma biblioteca C de terceiros que fornece umaprintf()função de log de estilo

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

Por razões que não valem a pena abordar, precisamos limitar a taxa na qual as mensagens são registradas, algo como

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

Felizmente, os autores da biblioteca C sabiam o que estavam fazendo e forneceram

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

portanto, escrever a função acima é uma questão relativamente simples. Infelizmente, porémfunções variadas não funcionam bem com inlining, então eu vim com uma segunda solução:

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

Isso funciona perfeitamente e alinha a condição de limitação da taxa como gostaríamos. Mas tenho algumas perguntas sobre isso:

A expansão de um pacote de parâmetros em uma chamada de função variadica no estilo C como esta é uma coisa legal e bem definida a ser feita no C ++ 11, ou apenas tivemos sorte de funcionar?

São as&&&nbsp;estd::forward&nbsp;realmente necessário aqui, já que estamos chamando uma função C? Parece funcionar tão bem se eu usarconst T&ou mesmo apenasT&nbsp;por valor, com ou semstd::forward.