Conversión de C ++ char * [] a char **

Tengo este código simple que compila sin errores / advertencias:

void f(int&, char**&){}

int main(int argc, char* argv[])
{
    f(argc, argv);
    return 0;
}

Y el siguiente código similar que no compila:

void f(int&, char**&){}

int main()
{
    int argc = 2;
    char* argv[] = { "", "", nullptr };
    f(argc, argv); 
    //@VS2013 error: cannot convert argument 2 from 'char *[3]' to 'char **&'
    //@GCC error: invalid initialization of non-const reference of type 'char**&' from an rvalue of type 'char**'
    return 0;
}

Por quéchar*[] se puede convertir achar**& en la primera muestra y no se puede convertir en la segunda muestra? ¿Importa si el tamaño es conocido en tiempo de compilación?

EDITAR: Creo que hay 2 conversiones necesarias en el segundo caso, y el compilador solo puede hacer una conversión implícita.

Este código compila bien:

void f(int&, char**&){}

int main()
{
    int argc = 2;
    char* temp[] = { "", "", nullptr };
    char** argv = temp;
    f(argc, argv);
    return 0;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta