Безопасно ли переинтерпретировать указатель на неквалифицированный тип в качестве указателя на квалифицированный тип? Рассмотрим стандартный тип макета, содержащий элемент указателя «void * ptr» и другой стандартный тип макета, определенный эквивалентно, но с «const void * ptr». Совместимы ли эти типы с макетами и зависит ли этот ответ от пересмотра языка или между C и C++?Указатель на квалифицированное и неквалифицированное представление типа
Мотивация:
Иногда при взаимодействии с программами C, один определяет параметры структуры группировки к некоторому типу буфера. Для const-correctness входной буфер должен иметь константные указатели на базовые буферы, но выходные буферы, очевидно, должны быть изменчивыми.
struct s1 { const void *ptr; }
struct s2 { void *ptr; }
const void *get_in_ptr(void);
void *get_out_ptr(void);
void alg(const s1 *in, const s2 *out);
void f()
{
s1 in_arg = { get_in_ptr() };
s2 out_arg1 = { get_out_ptr() };
s2 out_arg2 = { get_out_ptr() };
/* First algorithm pass. */
alg(&in_arg, &out_arg1);
/* Second algorithm pass. */
alg((const s1 *)&out_arg1, &out_arg2); /* Is this legal? */
}
Просьба привести соответствующие стандартные публикации в любых ответах.
Пожалуйста, предоставьте [mcve]. 'get_in_ptr' и' get_out_ptr' не определены. – Olaf
Я продлил пример. – 68ejxfcj5669