У меня есть этот простой код, который компилируется без ошибок/предупреждений:C++ символ * [] на символ ** преобразования
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**&
в первый образец и не может быть преобразован во втором образце? Имеет ли значение, известен ли размер во время компиляции?
EDIT: Я думаю, что во втором случае требуется 2 преобразования, и только одно неявное преобразование может быть выполнено компилятором.
Этот код компилируется нормально:
void f(int&, char**&){}
int main()
{
int argc = 2;
char* temp[] = { "", "", nullptr };
char** argv = temp;
f(argc, argv);
return 0;
}
Обратите внимание, что у вас есть больше проблем, чем что (связанные с совместимостью C++ 11), [см видеодемонстрацию здесь] (http://coliru.stacked-crooked.com/a/b27bbe925d88d735). – rubenvb
В параметре функции 'char * name []' и 'char ** name' * эквивалентны * - они обозначают одно и то же (более конкретно, первое преобразуется во второе). – Xeo
@rubenvb Я знаю, что const char * для char * устарел в C++ 11. Здесь также присутствуют другие проблемы с корректностью констант ... – Felics