C ++ char * [] para char ** conversão

Eu tenho este código simples que compila sem erros / avisos:

void f(int&, char**&){}

int main(int argc, char* argv[])
{
    f(argc, argv);
    return 0;
}

E próximo código semelhante que não compila:

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

Por quêchar*[] pode ser convertido parachar**& na primeira amostra e não pode ser convertido na segunda amostra? Importa se o tamanho é conhecido em tempo de compilação?

EDIT: Eu acho que há 2 conversões necessárias no segundo caso, e apenas uma conversão implícita pode ser feita pelo compilador.

Este código compila bem:

void f(int&, char**&){}

int main()
{
    int argc = 2;
    char* temp[] = { "", "", nullptr };
    char** argv = temp;
    f(argc, argv);
    return 0;
}

questionAnswers(3)

yourAnswerToTheQuestion