C ++ char * [] do konwersji char **

Mam ten prosty kod, który kompiluje się bez błędów / ostrzeżeń:

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

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

I kolejny podobny kod, który nie kompiluje:

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;
}

Czemuchar*[] można przekonwertować nachar**& w pierwszej próbce i nie można jej przekonwertować w drugiej próbce? Czy ma znaczenie, czy rozmiar jest znany w czasie kompilacji?

EDYCJA: Myślę, że w drugim przypadku potrzebne są 2 konwersje, a kompilator może wykonać tylko jedną niejawną konwersję.

Ten kod dobrze się kompiluje:

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

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

questionAnswers(3)

yourAnswerToTheQuestion