Пространства имён
Варианты
Действия

reinterpret_cast conversion

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Преобразование между типами по интерпретации основных битовой.
Оригинал:
Converts between types by reinterpreting the underlying bit pattern.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Синтаксис

reinterpret_cast < new_type > ( expression )
Возвращает значение типа new_type.
Оригинал:
Returns a value of type new_type.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Объяснение

В отличие от static_cast, но, как const_cast, reinterpret_cast выражение не компилировать в любой инструкции процессора. Это чисто директивы компилятора, который инструктирует компилятор для лечения последовательность битов (объект представление) expression как если бы это был тип new_type.
Оригинал:
Unlike static_cast, but like const_cast, the reinterpret_cast expression does not compile to any CPU instructions. It is purely a compiler directive which instructs the compiler to treat the sequence of bits (object representation) of expression as if it had the type new_type.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Только следующие преобразования может быть сделано с reintepret_cast, кроме случаев, когда такие преобразования будут разбрасывать константность' или' волатильность.
Оригинал:
Only the following conversions can be done with reintepret_cast, except when such conversions would cast away constness or volatility.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
1)
Выражение интеграла, перечислением, указателем или указателем на член типа могут быть преобразованы в свой тип. Полученное значение такое же, как значение expression. (начиная с C++11)
Оригинал:
An expression of integral, enumeration, pointer, or pointer-to-member type can be converted to its own type. The resulting value is the same as the value of expression. (начиная с C++11)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
Любой указатель может быть преобразован в любой интегрального типа достаточно большой, чтобы содержать значение указателя (например, для std::uintptr_t)
Оригинал:
Any pointer can be converted to any integral type large enough to hold the value of the pointer (e.g. to std::uintptr_t)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
Значение любого интегрального или типа перечисления может быть преобразован в тип указателя. Указатель преобразуется в целое достаточного размера и обратно на тот же тип указателя гарантированно иметь свое первоначальное значение, в противном случае в результате указатель не может быть разыменован безопасно. Нулевого указателя постоянной NULL или целого нуля не гарантирует доходность нулевое значение указателя целевого типа; static_cast или <div class="t-tr-text">неявного преобразования
Оригинал:
implicit conversion
Текст был переведён автоматически через [http://translate.google.com Google Translate].
Вы можете проверить и исправить перевод. Для инструкций кликните [http://en.cppreference.com/w/Cppreference:MachineTranslations сюда].
следует использовать для этой цели.
Оригинал:
A value of any integral or enumeration type can be converted to a pointer type. A pointer converted to an integer of sufficient size and back to the same pointer type is guaranteed to have its original value, otherwise the resulting pointer cannot be dereferenced safely. The null pointer constant NULL or integer zero is not guaranteed to yield the null pointer value of the target type; static_cast or
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
Любое значение типа std::nullptr_t, в том числе nullptr могут быть преобразованы в любой интегрального типа, как если бы это был (void*)0, но никакого значения, даже не nullptr могут быть преобразованы в std::nullptr_t: static_cast должны быть использованы для этой цели. (начиная с C++11)
Оригинал:
Any value of type std::nullptr_t, including nullptr can be converted to any integral type as if it was (void*)0, but no value, not even nullptr can be converted to std::nullptr_t: static_cast should be used for that purpose. (начиная с C++11)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5)
Любой указатель на объект типа T1 может быть преобразован в указатель на объект другого типа T2. Если требование выравнивания T2 не является более строгим, чем T1, в преобразовании полученной указатель возвращается к своей первоначальной выходы типа исходного значения, в противном случае в результате указатель не может быть разыменован безопасно. В любом случае, в результате указателя может быть разыменован безопасно, если это разрешено' типа сглаживания правила (см. ниже)
Оригинал:
Any pointer to object of type T1 can be converted to pointer to object of another type T2. If T2's alignment requirement is not stricter than T1's, conversion of the resulting pointer back to its original type yields the original value, otherwise the resulting pointer cannot be dereferenced safely. In any case, the resulting pointer may only be dereferenced safely if allowed by the type aliasing rules (see below)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
6)
Выражение именующее типа T1 могут быть преобразованы в ссылки на другой тип T2. В результате именующее или xvalue ссылаясь на тот же объект, что и оригинальный именующее, но с другим типом. Нет временного создан копии не сделал, не конструкторы или функции преобразования называются. В результате ссылка может быть доступна только безопасно, если это разрешено' типа сглаживания правила (см. ниже)
Оригинал:
An lvalue expression of type T1 can be converted to reference to another type T2. The result is an lvalue or xvalue referring to the same object as the original lvalue, but with a different type. No temporary is created, no copy is made, no constructors or conversion functions are called. The resulting reference can only be accessed safely if allowed by the type aliasing rules (see below)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
7)
Любой указатель на функцию может быть преобразован в указатель на другой тип функции. Вызов функции через указатель на другой тип функции не определены, но такие преобразования указатель обратно на указатель на исходный тип функции дает указатель на оригинальную функцию.
Оригинал:
Any pointer to function can be converted to a pointer to a different function type. Calling the function through a pointer to a different function type is undefined, but converting such pointer back to pointer to the original function type yields the pointer to the original function.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
8)
В некоторых реализациях (в частности, на любой POSIX-совместимой системы), указатель на функцию может быть преобразован в указатель на объект или наоборот. Если реализация поддерживает преобразование в обоих направлениях, преобразования в исходный тип дает первоначальное значение, в противном случае в результате указатель не может быть разыменован или называют безопасно.
Оригинал:
On some implementations (in particular, on any POSIX compatible system), a function pointer can be converted to an object pointer or vice versa. If the implementation supports conversion in both directions, conversion to the original type yields the original value, otherwise the resulting pointer cannot be dereferenced or called safely.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
9)
Нулевое значение указателя любого типа указателя может быть преобразован в любой другой тип указателя, в результате чего нулевое значение указателя этого типа. Обратите внимание, что нулевой указатель постоянной nullptr или любым другим значением типа std::nullptr_t не может быть преобразован в указатель с reinterpret_cast: неявное преобразование или static_cast следует использовать для этой цели.
Оригинал:
The null pointer value of any pointer type can be converted to any other pointer type, resulting in the null pointer value of that type. Note that the null pointer constant nullptr or any other value of type std::nullptr_t cannot be converted to a pointer with reinterpret_cast: implicit conversion or static_cast should be used for this purpose.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
10)
RValue указатель на функцию-член может быть преобразован в указатель на другую функцию-член другого типа. Преобразование исходного типа дает первоначальное значение, в противном случае в результате указатель не может быть использован безопасно.
Оригинал:
An rvalue pointer to member function can be converted to pointer to a different member function of a different type. Conversion to the original type yields the original value, otherwise the resulting pointer cannot be used safely.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
11)
RValue указатель на член объекта некоторого класса T1 может быть преобразован в указатель на другой объект члена другого класса T2. Если выравнивание T2 не является более строгим, чем T1 автора, переход на оригинальные выходы типа исходного значения, в противном случае в результате указатель не может быть использован безопасно.
Оригинал:
An rvalue pointer to member object of some class T1 can be converted to a pointer to another member object of another class T2. If T2's alignment is not stricter than T1's, conversion to the original type yields the original value, otherwise the resulting pointer cannot be used safely.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Как и во всех литых выражения, результат
Оригинал:
As with all cast expressions, the result is:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • именующее если new_type является тип именующее ссылку или RValue ссылка на функцию типа
    Оригинал:
    an lvalue if new_type is an lvalue reference type or an rvalue reference to function type;
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • xvalue если new_type является RValue ссылку на объект типа
    Оригинал:
    an xvalue if new_type is an rvalue reference to object type;
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • prvalue иначе.
    Оригинал:
    a prvalue otherwise.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Ключевые слова

reinterpret_cast

[править] Введите наложения

Когда указатель или ссылку на объект типа T1 является reintrepret_cast (или C-стиле литые) на указатель или ссылку на объект другого типа T2, поданных всегда успешно, но в результате указатель или ссылка может быть доступна только, если один из следующие условия:
Оригинал:
When a pointer or reference to object of type T1 is reintrepret_cast (or C-style cast) to a pointer or reference to object of a different type T2, the cast always succeeds, but the resulting pointer or reference may only be accessed if one of the following is true:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Т2 (возможно, резюме квалифицированных) динамического типа объекта
    Оригинал:
    T2 is the (possibly cv-qualified) dynamic type of the object
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • T2 и T1 оба (возможно, многоуровневое, возможно, CV-квалифицированы на каждом уровне) указателей на тот же тип T3 (начиная с C++11)
    Оригинал:
    T2 and T1 are both (possibly multi-level, possibly cv-qualified at each level) pointers to the same type T3 (начиная с C++11)
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Т2 (возможно, резюме квалифицированных) знаком или без знака вариант динамического типа объекта
    Оригинал:
    T2 is the (possibly cv-qualified) signed or unsigned variant of the dynamic type of the object
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • T2 представляет собой совокупность типов или объединения типа, которая занимает одно из вышеупомянутых типов элементов или не статические члены (в том числе, рекурсивно, элементы subaggregates и не статические данные члены, содержащиеся союзов): это делает его безопасным, чтобы бросить от первого члена структуры и из элемента союз структуры / объединения, которое содержит его.
    Оригинал:
    T2 is an aggregate type or a union type which holds one of the aforementioned types as an element or non-static member (including, recursively, elements of subaggregates and non-static data members of the contained unions): this makes it safe to cast from the first member of a struct and from an element of a union to the struct/union that contains it.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Т2 (возможно, резюме квалифицированных) базового класса динамического типа объекта
    Оригинал:
    T2 is a (possibly cv-qualified) base class of the dynamic type of the object
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • T2 is char or unsigned char
Если Т2 не удовлетворяет этим требованиям, доступ к объекту через новый указатель или ссылка вызывает неопределенное поведение. Это известно как' строгого сглаживания правила и применяется как C + + и языков программирования C.
Оригинал:
If T2 does not satisfy these requirements, accessing the object through the new pointer or reference invokes undefined behavior. This is known as the strict aliasing rule and applies to both C++ and C programming languages.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Пример

Демонстрирует некоторые виды использования reinterpret_cast
Оригинал:
Demonstrates some uses of reinterpret_cast:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

#include <cstdint>
#include <cassert>
#include <iostream>
int f() { return 42; }
int main()
{
    int i = 7;
 
    // pointer to integer and back
    uintptr_t v1 = reinterpret_cast<uintptr_t>(&i); // static_cast is an error
    std::cout << "The value of &i is 0x" << std::hex << v1 << '\n';
    int* p1 = reinterpret_cast<int*>(v1);
    assert(p1 == &i);
 
    // pointer to function to another and back
    void(*fp1)() = reinterpret_cast<void(*)()>(f);
    // fp1(); undefined behavior
    int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
    std::cout << std::dec << fp2() << '\n'; // safe
 
    // type aliasing through pointer
    char* p2 = reinterpret_cast<char*>(&i);
    if(p2[0] == '\x7')
        std::cout << "This system is little-endian\n";
    else
        std::cout << "This system is big-endian\n";
 
    // type aliasing through reference
    reinterpret_cast<unsigned int&>(i) = 42;
    std::cout << i << '\n';
}

Вывод:

The value of &i is 0x7fff352c3580
42
This system is little-endian
42

[править] См. также

const_cast преобразования
добавляет или удаляет Уст
Оригинал:
adds or removes const
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
[edit]
static_cast преобразования
выполняет основные преобразования
Оригинал:
performs basic conversions
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
[edit]
dynamic_cast преобразования
выполняет проверил полиморфных превращений
Оригинал:
performs checked polymorphic conversions
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
[edit]