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