а) X1 и X2 ниже эквивалентных? Если нет, то как следует выполнять явное переинтерпретирование / константное приведение?
void some_legacy_function(const void* arg) {
char** X1 = (char**) arg;
char** X2 = reinterpret_cast<char**>(const_cast<void*>(arg) );
/* not surprisingly, indexing into X1 randomly crashes in release build */
}
б) Этот актерский состав кажется мне довольно странным, действительно ли он на 100% легален при некоторых обстоятельствах?
а) первая строка эквивалентна static_cast<char**>(const_cast<void*>(arg))
, Я верю. Не то чтобы это имело значение.
б) Хорошо, если arg действительно указывает на массив char *. Если один reinterpret_cast
Если указатель T * на указатель U * (для произвольных типов T и U, связанных или иных) и обратно на T *, то гарантированно будет возвращено исходное значение. Так что да, можно построить пример, где этот код будет работать. Конечно, это не значит, что функция хорошо спроектирована.
Да, они в основном одинаковы, за исключением того, что приведение стиля c ++ показывает читателю кода, что вы делаете какие-то странные вещи, в то время как в стиле c это сложнее заметить.
Это законно, но, как всегда, весьма подозрительно, когда входящий параметр const приводится как не const.