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

static_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 using a combination of implicit and user-defined conversions.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

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

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

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

Только следующие преобразования может быть сделано с static_cast, кроме случаев, когда такие преобразования будут разбрасывать константность' или' волатильность.
Оригинал:
Only the following conversions can be done with static_cast, except when such conversions would cast away constness or volatility.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
1)
Если временный объект типа new_type может быть объявлен и инициализирован с expression, так как по new_type Temp(expression);, который может включать в себя неявные преобразования, вызов конструктора new_type или вызов определенной пользователем оператора преобразования, то static_cast<type>(expression) вычисляет и возвращает значение этого временного объекта.
Оригинал:
If a temporary object of type new_type can be declared and initialized with expression, as by new_type Temp(expression);, which may involve implicit conversions, a call to the constructor of new_type or a call to a user-defined conversion operator, then static_cast<type>(expression) computes and returns the value of that temporary object.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
Если new_type представляет собой указатель или ссылку на некоторый класс D и тип expression является указателем или ссылкой на его не виртуальные базы B, static_cast выполняет' опущенными. Такие static_cast не делает выполнения проверки, чтобы убедиться, что фактический тип объекта является на самом деле D, и может быть использована только безопасно, если это условие обеспечивается другими средствами, например, при осуществлении статический полиморфизм. Безопасный опустив может быть сделано с dynamic_cast.
Оригинал:
If new_type is a pointer or reference to some class D and the type of expression is a pointer or reference to its non-virtual base B, static_cast performs a downcast. Such static_cast makes no runtime checks to ensure that the object's runtime type is actually D, and may only be used safely if this precondition is guaranteed by other means, such as when implementing статический полиморфизм. Safe downcast may be done with dynamic_cast.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
Если new_type является тип RValue ссылки, static_cast преобразует значение expression в' xvalue. Этот тип static_cast используется для реализации семантика переноса в std::move. (начиная с C++11)
Оригинал:
If new_type is an rvalue reference type, static_cast converts the value of expression to xvalue. This type of static_cast is used to implement move semantics in std::move. (начиная с C++11)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
Если new_type это тип void (возможно, резюме квалифицированных), static_cast сбрасывает значение expression после оценки его.
Оригинал:
If new_type is the type void (possibly cv-qualified), static_cast discards the value of expression after evaluating it.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5) последовательность из new_type от типа expression существует, что не включает в себя именующее к RValue, массива в указатель, функции в указатель, пустой указатель, нулевого указателя член, или логическое преобразование, то static_cast может выполнять обратное, что неявные преобразования.
Оригинал:
If an
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
6)
Если преобразование expression в new_type включает в себя именующее к RValue, массива в указатель, или функции в указатель преобразования, оно может быть выполнено явно static_cast.
Оригинал:
If conversion of expression to new_type involves lvalue-to-rvalue, array-to-pointer, or function-to-pointer conversion, it can be performed explicitly by static_cast.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
7)
Scoped типа перечисления может быть преобразована в целое число или число с плавающей точкой типа. (начиная с C++11)
Оригинал:
Scoped enumeration type can be converted to an integer or floating-point type. (начиная с C++11)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
8)
Целое, с плавающей точкой, или типа перечисления может быть преобразован в любой тип перечисления (результат не определен, если значение expression, преобразуется в базовый тип перечисления, не является одним из целевых значений перечисления)
Оригинал:
Integer, floating-point, or enumeration type can be converted to any enumeration type (the result is unspecified if the value of expression, converted to the enumeration's underlying type, is not one of the target enumeration values)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
9)
Указатель на член некоторого класса D может быть восходящим к указателю на член своего B базового класса. Это static_cast не дает никаких проверок для обеспечения членов на самом деле существует в среде типа, то к объекту.
Оригинал:
A pointer to member of some class D can be upcast to a pointer to member of its base class B. This static_cast makes no checks to ensure the member actually exists in the runtime type of the pointed-to object.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
10)
Prvalue тип указателя на void (возможно, резюме квалифицированных) может быть преобразован в указатель на любой тип. Преобразование любого указателя на указатель на пустоту и обратно в указатель на оригинальную (или больше резюме квалифицированных) типа сохраняет свою первоначальную стоимость.
Оригинал:
A prvalue of type pointer to void (possibly cv-qualified) can be converted to pointer to any type. Conversion of any pointer to pointer to void and back to pointer to the original (or more cv-qualified) type preserves its original value.
Текст был переведён автоматически через 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.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Заметки

static_cast также может быть использован для устранения неоднозначности функции перегрузки, выполняя функции в указатель преобразование определенного типа, как и в std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::toupper));
Оригинал:
static_cast may also be used to disambiguate function overloads by performing a function-to-pointer conversion to specific type, as in std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::toupper));
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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

static_cast

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

#include <vector>
#include <iostream>
 
struct B {};
struct D : B {};
 
enum class E { ONE, TWO, THREE };
enum EU { ONE, TWO, THREE };
 
int main()
{
    // 1: initializing conversion
    int n = static_cast<int>(3.14);
    std::cout << "n = " << n << '\n';
    std::vector<int> v = static_cast<std::vector<int>>(10);
    std::cout << "v.size() = " << v.size() << '\n';
 
    // 2: static downcast
    D d;
    B& br = d; // upcast via implicit conversion
    D& another_d = static_cast<D&>(br); // downcast
 
    // 3: lvalue to xvalue
    std::vector<int> v2 = static_cast<std::vector<int>&&>(v);
    std::cout << "after move, v.size() = " << v.size() << '\n';
 
    // 4: discarded-value expression
    static_cast<void>(v2.size());
 
    // 5. inverse of implicit conversion
    // todo
 
    // 6. array-to-pointer followed by upcast
    D a[10];
    B* dp = static_cast<B*>(a);
 
    // 7. scoped enum to int or float
    E e = E::ONE;
    int one = static_cast<int>(e);
 
    // 8. int to enum, enum to another enum
    E e2 = static_cast<E>(one);
    EU eu = static_cast<EU>(e2);
 
    // 9. pointer to member upcast
    // todo
 
    // 10. void* to any type
    void* voidp = &e;
    std::vector<int>* p = static_cast<std::vector<int>*>(voidp);
}

Вывод:

n = 3
v.size() = 10
after move, v.size() = 0

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