Рассмотрим следующий код, который возник из "> этого вопроса :
const int (*foo(const char *a))[1]
{ return (const int (*)[1]) a; }
Когда скомпилировано с GCC 8.2 (и более ранними версиями) с использованием -Wcast-qual
,GCC предупреждает:
source>:2:15: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
{ return (const int (*)[1]) a; }
^
Правильно ли это предупреждение?Ясно, что тип назначения содержит спецификатор const
.
Он относится к типу элемента, а не к объекту, на который непосредственно указывает указатель, который является типом массива.Однако предупреждение остается, даже если мы используем typedef int T[1];
и заменяем приведение на (const T *)
.Кроме того, согласно C 2018 6.7.3 10 квалификаторы для типа массива применяются к типу элемента, а не к типу массива, поэтому тип одинаков в любом случае.
Clang не показывает это предупреждение.
Если мы изменим приведение на (const void *)
:
const int (*foo(const char *a))[1]
{ return (const void *) a; }
, предупреждение исчезнет.Если мы добавим -pedantic
к ключам компиляции, мы получим другое предупреждение о const
:
source>:2:15: warning: return discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
{ return (const void *) a; }
^~~~~~~~~~~~~~~~
Это похоже на то же предупреждение, за исключением того, что речь идет о подразумеваемом преобразовании из выражения возврата в функциютип возврата, тогда как предыдущее предупреждение касалось явного преобразования в приведении.Но этот появляется только с -pedantic
.Почему?