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