Pasar argumentos de plantilla variadic a una función variadic

Estamos utilizando una biblioteca C de terceros que proporciona unprintf()función de registro de estilo,

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

Por razones por las que no vale la pena entrar, debemos limitar la velocidad a la que se registran los mensajes, algo similar a

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

Afortunadamente, los autores de la biblioteca C sabían lo que estaban haciendo y proporcionaron

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

así que escribir la función anterior es una cuestión relativamente simple. Desafortunadamente sin embargolas funciones variadas no juegan bien con la alineación, y entonces se me ocurrió una segunda solución:

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

Esto funciona perfectamente y alinea la condición de limitación de velocidad como nos gustaría. Pero tengo un par de preguntas al respecto:

¿Expandir un paquete de parámetros a una llamada de función variable de estilo C como esta es algo legal y bien definido para hacer en C ++ 11, o simplemente tenemos suerte de que funcione?

Son los&& ystd::forward realmente necesario aquí, dado que estamos llamando a una función C? Parece que funciona igual de bien si usoconst T&o incluso soloT por valor, con o sinstd::forward.

Respuestas a la pregunta(2)

Su respuesta a la pregunta