Konvertierung von C ++ char * [] nach char **

Ich habe diesen einfachen Code, der ohne Fehler / Warnungen kompiliert:

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

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

Und der nächste ähnliche Code, der nicht kompiliert wird:

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

Warumchar*[] kann konvertiert werden zuchar**& in der ersten Probe und kann nicht in der zweiten Probe konvertiert werden? Ist es wichtig, ob die Größe zum Zeitpunkt der Kompilierung bekannt ist?

EDIT: Ich denke, es sind 2 Konvertierungen im zweiten Fall erforderlich, und nur eine implizite Konvertierung kann vom Compiler durchgeführt werden.

Dieser Code kompiliert gut:

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

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage