является ли char ** x = (char **) arg эквивалентным reinterpret_cast & lt; char ** & gt; (const_cast & lt; void * & gt; (arg))?

а) 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% легален при некоторых обстоятельствах?

3

Решение

а) первая строка эквивалентна static_cast<char**>(const_cast<void*>(arg)), Я верю. Не то чтобы это имело значение.

б) Хорошо, если arg действительно указывает на массив char *. Если один reinterpret_castЕсли указатель T * на указатель U * (для произвольных типов T и U, связанных или иных) и обратно на T *, то гарантированно будет возвращено исходное значение. Так что да, можно построить пример, где этот код будет работать. Конечно, это не значит, что функция хорошо спроектирована.

4

Другие решения

Да, они в основном одинаковы, за исключением того, что приведение стиля c ++ показывает читателю кода, что вы делаете какие-то странные вещи, в то время как в стиле c это сложнее заметить.

Это законно, но, как всегда, весьма подозрительно, когда входящий параметр const приводится как не const.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector