C ++ char * [] to char ** преобразование
У меня есть этот простой код, который компилируется без ошибок / предупреждений:
void f(int&, char**&){}
int main(int argc, char* argv[])
{
f(argc, argv);
return 0;
}
И следующий похожий код, который не компилируется:
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;
}
Почемуchar*[]
может быть преобразован вchar**&
в первом примере и не могут быть преобразованы во втором примере? Имеет ли значение, если размер известен во время компиляции?
РЕДАКТИРОВАТЬ: Я думаю, что во втором случае необходимо 2 преобразования, и только одно неявное преобразование может быть сделано компилятором.
Этот код прекрасно компилируется:
void f(int&, char**&){}
int main()
{
int argc = 2;
char* temp[] = { "", "", nullptr };
char** argv = temp;
f(argc, argv);
return 0;
}