Почему у нас есть reinterpret_cast в C ++, когда два связанных static_cast могут делать свою работу?

Допустим, я хочу преобразовать A * в char * и наоборот, у нас есть два варианта (я имею в виду, многие из нас думают, что нас двое choices, потому что оба, похоже, работают! Отсюда путаница!):

struct A
{
    int age;
    char name[128];
};

A a;
char *buffer = static_cast(static_cast(&a)); //choice 1
char *buffer = reinterpret_cast(&a); //choice 2

Оба работают нормально.

//convert back
A *pA = static_cast(static_cast(buffer)); //choice 1
A *pA = reinterpret_cast(buffer); //choice 2

Даже это работает нормально!

Итак, почему у нас есть reinterpret_cast в C ++, когда два связанных static_cast могут выполнять свою работу?

Некоторые из вас могут подумать, что эта тема дублирует предыдущие темы, такие как перечисленные в конце этого сообщения, но это не . Эти темы обсуждаются только теоретически, , но ни одна из них не дает ни единого примера, демонстрирующего , почему reintepret_cast действительно нужен, а два static_cast будут наверняка не получится. Согласен, один static_cast потерпит неудачу. Но как насчет двух?

Если синтаксис двухцепочечного static_cast выглядит громоздким, тогда мы можем написать шаблон функции, чтобы сделать его более удобным для программистов:

template
To any_cast(From v)
{
    return static_cast(static_cast(v));
}

И тогда мы можем использовать это, как :

char *buffer = any_cast(&a); //choice 1
char *buffer = reinterpret_cast(&a); //choice 2

//convert back
A *pA = any_cast(buffer); //choice 1
A *pA = reinterpret_cast(buffer); //choice 2

Также см. Эту ситуацию, где any_cast может быть полезным: Правильное приведение типов для функций-членов чтения и записи fstream .

Итак, мой вопрос в основном таков:

  • Почему есть ли у нас reinterpret_cast в C ++?
  • Покажите мне хотя бы один пример, где два связанных static_cast наверняка не справятся с одной и той же задачей?

40
задан Community 23 May 2017 в 10:31
поделиться