Назначение <указатель на массив констант> = <указатель на массив>: несовместимые указатели
Когда я собираю что-то вроде этого
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 ++), и он не дает никаких ошибок, никаких предупреждений вообще. Я отредактировал комментарии к вышеуказанному коду