Ich habe diesen einfachen Code, der ohne Fehler/Warnungen kompiliert:C++ char * [] char ** Umwandlung
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;
}
Warum:
void f(int&, char**&){}
int main(int argc, char* argv[])
{
f(argc, argv);
return 0;
}
Und neben ähnlichen Code, der nicht kompilieren char*[]
kann im ersten Beispiel in char**&
konvertiert werden und kann nicht in das zweite Beispiel konvertiert werden? Ist es wichtig, ob die Größe zur Kompilierzeit bekannt ist?
EDIT: Ich denke, es gibt 2 Konvertierungen im zweiten Fall benötigt, und nur eine implizite Konvertierung kann vom Compiler durchgeführt werden.
Dieser Code kompiliert fein:
void f(int&, char**&){}
int main()
{
int argc = 2;
char* temp[] = { "", "", nullptr };
char** argv = temp;
f(argc, argv);
return 0;
}
Beachten Sie, dass Sie mehr Probleme als das (bezogen auf C++ 11-Kompatibilität) haben [siehe hier Live-Demo] (http://coliru.stacked-crooked.com/a/b27bbe925d88d735). – rubenvb
Im Funktionsparameter sind 'char * name []' und 'char ** name' * äquivalent * - sie bezeichnen dasselbe (genauer gesagt, das erstere wird in das letztere umgewandelt). – Xeo
@rubenvb Ich weiß const char * char * ist in C++ 11 veraltet. Auch andere const Korrektheitsprobleme sind hier vorhanden ... – Felics