Przypisanie <wskaźnik do tablicy stałych> = <wskaźnik do tablicy>: niezgodne wskaźniki

Kiedy kompiluję coś takiego

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

gcc ostrzega mnie

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

Pytanie: Jaki jest problem z tym zadaniem? Tak, technicznie, są to różne typy, ale nie widzę tu żadnego niebezpieczeństwa,double const (*)[ 3 ] wygląda dla mnie jeszcze bezpieczniej niżdouble (*)[ 3 ].

Zrobiłem kilka testów i wyniki jeszcze bardziej mnie mylą:

1) MSVC jest bardzo zadowolonydouble const (* cpda)[ 3 ] = pda; przypisanie, brak błędów, brak ostrzeżeń.

2) Zarówno gcc, jak i MSVC są z tego zadowoleni

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

podczas gdy są to różne typy.

3) W tym przykładzie

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

gcc wyświetla to samo ostrzeżenie, ale MSVC podaje błąd (!).

Kto jest tutaj? gcc lub MSVC?

Wyniki testów.

Kompilatory:

1) gcc wersja 4.7.2:http://www.compileonline.com/compile_c_online.php

2) MSVC (jako kod C ++) wersja „VS2012CTP” 17.00.51025 dla x86:http://rise4fun.com/vcpp

3) MSVC (jako kod C) VS2010: testowany w trybie 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;
}

Edytować:

Właśnie skompilowałem to w moim Visual Studio jako kod C (nie C ++) i nie daje żadnych błędów, żadnych ostrzeżeń. Edytowałem komentarze do powyższego kodu

questionAnswers(3)

yourAnswerToTheQuestion