Почему этот отказ от const-квалификации не приводит ни к какому предупреждению? - PullRequest
0 голосов
/ 18 января 2019
struct istruct {
   const int i;
};
const int i = 1;
struct istruct is = {1};

void *voidp_i = &i; // warning: discards 'const' qualifier
void *voidp_is = &is; // no warning

Для всех намерений и целей struct istruct, по-видимому, интерпретируется как тип с квалификацией const. Если это так, то не имеет ли смысл также, чтобы последняя строка выдавала предупреждение?

1 Ответ

0 голосов
/ 18 января 2019
void *voidp_is = &is;

Здесь &is имеет тип struct istruct * и не имеет квалификатора const, только член i равен const. Обратите внимание, что запись в const член структуры (например, ((struct istruct *) voidp_is)->i=0;) приведет к неопределенному поведению, так как вы изменяете const int. (C2011, 6.7.3 / 6)

void *voidp_i = &i;

В этом примере &i имеет тип int const *, а квалификатор const сбрасывается при инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...