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

Ответы на вопрос(3)

Ваш ответ на вопрос