Является ли const-кастинг через объединение неопределенным поведением?

В отличие от C++, в C нет понятия const_cast. То есть, не существует корректного способа преобразовать указатель с оговоркой const в указатель без оговорки:

void const * p;
void * q = p;    // not good

Во-первых: Является ли это приведение на самом деле неопределенным поведением?

В любом случае, GCC предупреждает об этом. Чтобы сделать "чистый" код, требующий const-каст (т.е. когда я могу гарантировать, что не буду изменять содержимое, но все, что у меня есть - это изменяемый указатель), я видел следующий трюк "преобразования":

typedef union constcaster_
{
    void * mp;
    void const * cp;
} constcaster;

Использование: u.cp = p; q = u.mp;.

Каковы правила языка Си по отбрасыванию константности через такое объединение? Мои знания языка Си очень скудные, но я слышал, что Си гораздо мягче относится к доступу к союзам, чем C++, поэтому, хотя у меня плохое предчувствие по поводу этой конструкции, я хотел бы получить аргумент из стандарта (C99, я полагаю, хотя, если это изменилось в C11, было бы неплохо узнать).

17
задан timrau 16 August 2012 в 15:43
поделиться