В отличие от C++, C не имеет понятия const_cast
. То есть, не существует действительный способ преобразовать константный указатель квалифицированных неквалифицированному указатель:Является ли const-casting через undefined поведение соединения?
void const * p;
void * q = p; // not good
Во-первых: Является ли это приведение фактически неопределенное поведение?
В любом случае GCC предупреждает об этом. Чтобы сделать «чистый» код, который требует const-cast (то есть, где я могу гарантировать, что я не буду мутировать содержимое, но все, что у меня есть, является изменяемым указателем), я видел следующий «конверсионный» трюк:
typedef union constcaster_
{
void * mp;
void const * cp;
} constcaster;
Использование: u.cp = p; q = u.mp;
.
Каковы правила языка C при отбрасывании констебля через такой союз? Мои знания о C только очень неоднородны, но я слышал, что C гораздо более мягко относится к объединенному доступу, чем к C++, поэтому, хотя у меня плохое представление об этой конструкции, я бы хотел аргумент из стандарта (C99, я полагаю, хотя, если это изменилось на C11, это будет полезно знать).
ли вы имеете в виду 'недействительным * д = (Недействительными *) p' в первый блок кода? – kennytm
@KennyTM: Да - мне нужен явный приведение и/или это имеет значение? –
Без неявного броска gcc предупреждает об отбрасывании квалификаторов. Но gcc все еще сообщает об ошибке («элемент инициализатора не является постоянным») даже при передаче. –