explicit type conversion
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
Преобразование между типами с использованием комбинации явных и неявных преобразований.
Оригинал:
Converts between types using a combination of explicit and implicit conversions.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Синтаксис
( new_type ) expression
|
(1) | ||||||||
new_type ( expression )
|
(2) | ||||||||
new_type ( expressions )
|
(3) | ||||||||
new_type ( )
|
(4) | ||||||||
new_type { expression-list(необязательно) }
|
(5) | (начиная с C++11) | |||||||
template ( expressions(необязательно) )
|
(6) | (начиная с C++17) | |||||||
template { expressions(необязательно) }
|
(7) | (начиная с C++17) | |||||||
Возвращает значение типа
new_type.Оригинал:
Returns a value of type
new_type.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Объяснение
1)
Когда C-стиле литые выражение встречается, компилятор пытается следующие выражения актеров, в следующем порядке:
Оригинал:
When the C-style cast expression is encountered, the compiler attempts the following cast expressions, in this order:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
a) const_cast<new_type>(expression)
b)
static_cast<new_type>(expression), со следующими расширениями: указатель или ссылку на производный класс, дополнительно разрешено быть приведен к указателю или ссылки на однозначный базового класса (и наоборот), даже если базовый класс недоступен (то есть, это приведение игнорирует частного наследования спецификатор). То же относится и к литья указатель на член Указатель на член unambigous не виртуальные базы
Оригинал:
static_cast<new_type>(expression), with extensions: pointer or reference to a derived class is additionally allowed to be cast to pointer or reference to unambiguous base class (and vice versa) even if the base class is inaccessible (that is, this cast ignores the private inheritance specifier). Same applies to casting pointer to member to pointer to member of unambigous non-virtual base
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
c)
static_cast (с расширениями), а затем const_cast
Оригинал:
static_cast (with extensions) followed by const_cast
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
d) reinterpret_cast<new_type>(expression)
e)
reinterpret_cast следует const_cast
Оригинал:
reinterpret_cast followed by const_cast
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
@ @ Первый выбор, который удовлетворяет требованиям соответствующего оператора приведения выбран, даже если он не может быть скомпилирована (см. пример).
Оригинал:
@@ The first choice that satisfies the requirements of the respective cast operator is selected, even if it cannot be compiled (see example).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
@ @ Кроме того, C-стиле литые обозначения допускается подавать от, до, так и между указателями на неполный тип класса. Если оба expression и new_type являются указателями на неполные типы класса, это неопределенное ли static_cast или reinterpret_cast получает выбранные.
Оригинал:
@@ In addition, C-style cast notation is allowed to cast from, to, and between pointers to incomplete class type. If both expression and new_type are pointers to incomplete class types, it's unspecified whether static_cast or reinterpret_cast gets selected.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
Функциональные литых состоит из простой спецификатор типа или ЬурейеЕ спецификатор (другими словами, одним словом имя типа: unsigned int(expression) или int*(expression) не действительны), а затем одно выражение в круглых скобках. Это литье в точности эквивалентен соответствующему C-стиле литые выражения.
Оригинал:
The functional cast consists of a simple type specifier or a typedef specifier (in other words, a single-word type name: unsigned int(expression) or int*(expression) are not valid), followed by a single expression in parentheses. This cast is exactly equivalent to the corresponding C-style cast expression.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Как и во всех литых выражения, результат
Оригинал:
As with all cast expressions, the result is:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
- именующее если new_type является тип именующее ссылку или RValue ссылка на функцию типаОригинал:an lvalue if new_type is an lvalue reference type or an rvalue reference to function type;Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - xvalue если new_type является RValue ссылку на объект типаОригинал:an xvalue if new_type is an rvalue reference to object type;Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - prvalue иначе.Оригинал:a prvalue otherwise.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Пример
Запустить этот код
double f = 3.14; unsigned int n1 = (unsigned int)f; // C-style cast unsigned int n2 = unsigned(f); // functional cast class C1; class C2; C2* foo(C1* p) { return (C2*)p; // casts incomplete type to incomplete type } // In this example, C-style cast is interpreted as static_cast // even though it would work as reinterpret_cast struct A {}; struct I1 : A {}; struct I2 : A {}; struct D : I1, I2 {}; int main() { D* d = nullptr; A* a = (A*)d; // compile-time error A* a = reinterpret_cast<A*>(d); // this compiles }

