Назначение <указатель на массив констант> = <указатель на массив>: несовместимые указатели

Когда я собираю что-то вроде этого

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

GCC предупреждает меня

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

Вопрос: В чем проблема с этим заданием? Да, технически это разные типы, но я не вижу здесь никакой опасности,double const (*)[ 3 ] выглядит даже безопаснее для меня, чемdouble (*)[ 3 ].

Я сделал несколько тестов и результаты смущают меня еще больше:

1) MSVC вполне доволенdouble const (* cpda)[ 3 ] = pda; назначение, без ошибок, без предупреждений.

2) И gcc, и MSVC довольны этим

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

в то время как это разные типы тоже.

3) В этом примере

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

gcc выдает то же предупреждение, но MSVC выдает ошибку (!).

Кто здесь? GCC или MSVC?

Результаты теста.

Составители:

1) версия gcc 4.7.2:http://www.compileonline.com/compile_c_online.php

2) MSVC (в виде кода C ++) версия VS2012CTP 17.00.51025 для x86:http://rise4fun.com/vcpp

3) MSVC (как код C) VS2010: тестирование в автономном режиме

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

Редактировать:

Я только что скомпилировал это в моей Visual Studio как код C (не C ++), и он не дает никаких ошибок, никаких предупреждений вообще. Я отредактировал комментарии к вышеуказанному коду

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

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