reinterpret_cast для того же типа - PullRequest
4 голосов
/ 17 октября 2019

Рассмотрим следующую программу:

struct A{};

int main()
{
    A a;
    A b = a;
    A c = reinterpret_cast<A>(a);
}

Компилятор (g ++ 14) выдает ошибку о invalid cast from type 'A' to type 'A'. Почему приведение к тому же типу недопустимо?

Ответы [ 3 ]

4 голосов
/ 17 октября 2019

Это не разрешено, потому что стандарт говорит так.

Существует довольно ограниченный набор разрешенных преобразований, которые вы можете делать с reinterpret_cast. Смотрите, например, cppreference . Например, первая точка в списке:

1) Выражение целочисленного типа, перечисления, указателя или указателя на член может быть преобразовано в его собственный тип. Результирующее значение совпадает со значением выражения. (начиная с C ++ 11)

Однако приведение собственного типа (без указателя!) к себе отсутствует в списке. Зачем ты это делаешь?

1 голос
/ 17 октября 2019

reinterpret_cast должен использоваться для указателей, ссылок и целочисленных типов.

Я не знаю, почему кто-то это делает.

Но все же вы хотите сделать. Вы можете делать как.

 A *d = reinterpret_cast<A*>(&a);

или

A c = reinterpret_cast<A&>(a);
1 голос
/ 17 октября 2019

Поскольку reinterpret_cast нельзя использовать для классов и структур, его следует использовать для переинтерпретации указателей, ссылок и целочисленных типов. Это очень хорошо объяснено в cpp reference

Итак, в вашем случае одно из возможных допустимых выражений будет reinterpret_cast<A*>(&a)

...