Atribuição <ponteiro para matriz de constantes> = <ponteiro para matriz>: ponteiros incompatíveis

Quando eu compilar algo assim

double da[ 3 ] = { 2., 3., 4. };
double (* pda)[ 3 ] = &da;
double const (* cpda)[ 3 ] = pda; // gcc: warning; MSVC: ok

o gcc me avisa

warning: initialization from incompatible pointer type [enabled by default]

Pergunta: Qual é o problema com esta tarefa? Sim, tecnicamente, esses são tipos diferentes, mas não vejo nenhum perigo aqui,double const (*)[ 3 ] parece ainda mais seguro para mim do quedouble (*)[ 3 ].

Fiz alguns testes e os resultados me confundem ainda mais:

1) MSVC está muito feliz comdouble const (* cpda)[ 3 ] = pda; atribuição, sem erros, sem avisos.

2) Tanto o gcc quanto o MSVC estão felizes com isso

double d = 1.;
double * pd = &d;
double const * cpd = pd;  // gcc: ok; MSVC: ok

enquanto estes são tipos diferentes também.

3) Neste exemplo

double d = 1.;
double * pd = &d;
double * * ppd = &pd;
double const * * cppd = ppd;  // gcc: warning; MSVC: error

O gcc dá o mesmo aviso, mas o MSVC dá erro (!).

Quem está aqui mesmo? gcc ou MSVC?

Resultado dos testes.

Compiladores:

1) versão 4.7.2 do gcc:http://www.compileonline.com/compile_c_online.php

2) MSVC (como código C ++) versão 'VS2012CTP' 17.00.51025 para x86:http://rise4fun.com/vcpp

3) MSVC (como código C) VS2010: testado offline

int main()
{
    double d = 1.;

    double * pd = &d;
    double const * cpd = pd;
    // gcc: ok
    // MSVC C++: ok
    // MSVC C: ok

    double * * ppd = &pd;
    double const * * cppd = ppd;
    // gcc: warning: initialization from incompatible pointer type [enabled by default]
    // MSVC C++: error C2440: 'initializing' : cannot convert from 'double **' to 'const double **'
    // MSVC C: ok

    double da[ 3 ] = { 2., 3., 4. };

    double (* pda)[ 3 ] = &da;
    double const (* cpda)[ 3 ] = pda;
    // gcc: warning: initialization from incompatible pointer type [enabled by default]
    // MSVC C++: ok
    // MSVC C: ok

    cpd, cpda;
    return 0;
}

Editar:

Eu apenas compilei isso no meu Visual Studio como código C (não C ++) e ele não fornece nenhum erro, nenhum aviso. Eu editei comentários para o código acima

questionAnswers(3)

yourAnswerToTheQuestion