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

Implicit conversions

Материал из 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)
Разное
Ассемблерные вставки
 
Неявные преобразования выполняются всякий раз, когда выражение некоторого типа T1 используется в контексте, который не принимает этого типа, но принимает некоторые другие T2 типа, в частности:
Оригинал:
Implicit conversions are performed whenever an expression of some type T1 is used in context that does not accept that type, but accepts some other type T2, in particular:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Когда выражение используется в качестве аргумента при вызове функции, которая объявлена ​​с T2 в качестве параметра.
    Оригинал:
    When the expression is used as the argument when calling a function that is declared with T2 as parameter.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Когда выражение используется в качестве операнда с оператором, который ожидает T2
    Оригинал:
    When the expression is used as an operand with an operator that expects T2
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • При инициализации нового объекта типа T2, в том числе return заявление, в функции, возвращающей T2.
    Оригинал:
    When initializing a new object of type T2, including return statement in a function returning T2.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Когда выражение используется в switch заявление (T2 является неотъемлемой частью типа)
    Оригинал:
    When the expression is used in a switch statement (T2 is integral type)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Когда выражение используется в if заявление или петли (T2 является bool)
    Оригинал:
    When the expression is used in an if statement or a loop (T2 is bool)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Программа имеет хорошо сформированные (компилирует), только если существует один однозначный неявное преобразование последовательности из T1 в T2.
Оригинал:
The program is well-formed (compiles) only if there exists one unambiguous implicit conversion sequence from T1 to T2.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
При наличии нескольких перегрузок функции или оператора вызова, после того, как неявная последовательность преобразования построено от T1 до T2 доступны каждому, Разрешение перегрузки правил решить, какие перегрузки составлен.
Оригинал:
If there are multiple overloads of the function or operator being called, after the implicit conversion sequence is built from T1 to each available T2, Разрешение перегрузки rules decide which overload is compiled.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Орден преобразований

Неявные преобразования последовательности состоит из следующих, в следующем порядке:
Оригинал:
Implicit conversion sequence consists of the following, in this order:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1)
ноль или один' стандартная последовательность преобразования
Оригинал:
zero or one standard conversion sequence
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
ноль или один пользовательского преобразования
Оригинал:
zero or one user-defined conversion
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3)
ноль или один стандартную последовательность преобразования
Оригинал:
zero or one standard conversion sequence
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
При рассмотрении аргумента конструктора или определяемые пользователем функции преобразования, только одна стандартная последовательность преобразование разрешено (в противном случае пользовательские преобразования могут быть эффективно прикован). При переходе от одного встроенного типа в другой встроенного типа, только одна стандартная последовательность преобразование разрешено.
Оригинал:
When considering the argument to a constructor or to a user-defined conversion function, only one standard conversion sequence is allowed (otherwise user-defined conversions could be effectively chained). When converting from one built-in type to another built-in type, only one standard conversion sequence is allowed.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Стандартная последовательность преобразования состоит из следующих, в следующем порядке:
Оригинал:
A standard conversion sequence consists of the following, in this order:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1)
ноль или один' именующее преобразований
Оригинал:
zero or one lvalue transformation
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
ноль или один цифровой продвижение или' числовые преобразования
Оригинал:
zero or one numeric promotion or numeric conversion
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3)
ноль или один' квалификации регулировки
Оригинал:
zero or one qualification adjustment
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Пользовательского преобразования состоит из:
Оригинал:
A user-defined conversion consists of:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
@ * @ Нуль или один не явный одним аргументом конструктора или не явного преобразования вызова функции
Оригинал:
@*@ zero or one non-explicit single-argument constructor or non-explicit conversion function call
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Выражение e называется неявно преобразуются в T2 тогда и только тогда декларацию T2 t=e; хорошо сформирован (может быть скомпилирована), для некоторых придумали временные t. Обратите внимание, что это отличается от T2 t(e), где явные конструкторы и функции преобразования будет дополнительно рассматриваться.
Оригинал:
An expression e is said to be implicitly convertible to T2 if and only if the declaration T2 t=e; is well-formed (can be compiled), for some invented temporary t. Note that this is different from T2 t(e), where explicit constructors and conversion functions would additionally be considered.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Одним из исключений является вышеуказанное правило является специальным неявного преобразования вызывается в следующих пяти контекстах (начиная с C++11), где тип bool ожидается
Оригинал:
One exception is the above rule is the special implicit conversion invoked in the following five contexts (начиная с C++11), where type bool is expected:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • управление выражение if, while, for
    Оригинал:
    controlling expression of if, while, for
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • логические операторы !, && и ||
    Оригинал:
    the logical operators !, && and ||
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • условная ?: оператора
    Оригинал:
    the conditional operator ?:
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • static_assert
  • noexcept
В таких условиях, неявные преобразования последовательности построен, если декларация bool t(e); хорошо сформированы. то есть явным определяемые пользователем функции преобразования, такие как explicit T::operator bool() const; считается. Такие e выражение называется контекстуально, конвертируемых в BOOL.
Оригинал:
in such contexts, implicit conversion sequence is built if the declaration bool t(e); is well-formed. that is, the explicit user-defined conversion function such as explicit T::operator bool() const; is considered. Such expression e is said to be contextually convertible to bool.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Lvalue преобразований

Lvalue преобразования применяются при именующее аргументов (например, ссылка на объект) используется в контексте, где RValue (например, числа) ожидается.
Оригинал:
Lvalue transformations are applied when lvalue argument (e.g. reference to an object) is used in context where rvalue (e.g. a number) is expected.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Lvalue в RValue преобразования

Glvalue любого не-функцию, не тип массива T может быть неявно преобразован в prvalue того же типа. Если T не является классом, это преобразование также удаляет CV-квалификаторы. Если встречаются в невычисленного контексте (в операнд SizeOf, TypeId, noexcept, или decltype), это преобразование эффективно копирование создает временный объект типа T с использованием оригинальных glvalue в качестве аргумента конструктора, и что временный объект возвращается в виде prvalue. Если glvalue имеет тип std::nullptr_t, в результате prvalue является нулевым указателем постоянной nullptr.
Оригинал:
A glvalue of any non-function, non-array type T can be implicitly converted to prvalue of the same type. If T is a non-class type, this conversion also removes cv-qualifiers. Unless encountered in unevaluated context (in an operand of sizeof, typeid, noexcept, or decltype), this conversion effectively copy-constructs a temporary object of type T using the original glvalue as the constructor argument, and that temporary object is returned as a prvalue. If the glvalue has the type std::nullptr_t, the resulting prvalue is the null pointer constant nullptr.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Массив для преобразования указателей

Именующее или RValue типа "массив N T" или "массив неизвестного границу T" может быть неявно преобразован в prvalue типа "указатель на T". В результате указатель ссылается на первый элемент массива.
Оригинал:
A lvalue or rvalue of type "array of N T" or "array of unknown bound of T" can be implicitly converted to a prvalue of type "pointer to T". The resulting pointer refers to the first element of the array.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Функция указатель

Именующее функции T типа может быть неявно преобразован в prvalue указатель на эту функцию. Это не относится к не-статические функции-члены, потому что lvalues, которые относятся к не-статические функции-члены не существует.
Оригинал:
An lvalue of function type T can be implicitly converted to a prvalue pointer to that function. This does not apply to non-static member functions because lvalues that refer to non-static member functions do not exist.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Числовые акциях

[править] Интегральное продвижение по службе

Prvalues ​​малых целых типов (например, char) могут быть преобразованы в prvalues ​​больших интегральных типов (например, int). В частности, арифметических операторов не принимаю типов меньше, чем int в качестве аргументов, и интегральные акции автоматически применяются. Это преобразование всегда сохраняет значение.
Оригинал:
Prvalues of small integral types (such as char) may be converted to prvalues of larger integral types (such as int). In particular, арифметических операторов do not accept types smaller than int as arguments, and integral promotions are automatically applied. This conversion always preserves the value.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Следующие неявные преобразования классифицируются как неотъемлемой акциях
Оригинал:
The following implicit conversions are classified as integral promotions:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • signed char или signed short могут быть преобразованы в int.
    Оригинал:
    signed char or signed short can be converted to int.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • unsigned char или unsigned short могут быть преобразованы в unsigned int.
    Оригинал:
    unsigned char or unsigned short can be converted to unsigned int.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • char могут быть преобразованы в int или unsigned int в зависимости от базового типа: signed char или unsigned char (см. выше)
    Оригинал:
    char can be converted to int or unsigned int depending on the underlying type: signed char or unsigned char (see above)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • wchar_t, char16_t, и char32_t может быть преобразован в первый тип из списка в состоянии провести весь свой диапазон значений: int, unsigned int, long, unsigned long, long long, unsigned long long.
    Оригинал:
    wchar_t, char16_t, and char32_t can be converted to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long, long long, unsigned long long.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • ' Незаданной перечисления типа, базовый тип не зафиксировано может быть преобразован в первый тип из списка в состоянии провести весь свой диапазон значений: int, unsigned int, long, unsigned long, long long, или unsigned long long. Если значение диапазона больше не применяются интегральные акциях.
    Оригинал:
    An unscoped enumeration type whose underlying type is not fixed can be converted to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long, long long, or unsigned long long. If the value range is greater, no integral promotions apply.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • ' Незаданной перечисления типа, базовый тип фиксируется могут быть преобразованы в своем способствовало базового типа. (начиная с C++11)
    Оригинал:
    An unscoped enumeration type whose underlying type is fixed can be converted to its promoted underlying type. (начиная с C++11)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Типа' битовые поля могут быть преобразованы в int, если он может представлять весь диапазон значения битовых полей, в противном случае unsigned int, если он может представлять весь диапазон значения битовых полей, в противном случае интеграл акциях применять.
    Оригинал:
    A bitfield type can be converted to int if it can represent entire value range of the bitfield, otherwise to unsigned int if it can represent entire value range of the bitfield, otherwise no integral promotions apply.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Тип bool могут быть преобразованы в int со значением false становится 0 и true становится 1.
    Оригинал:
    The type bool can be converted to int with the value false becoming 0 and true becoming 1.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] С плавающей точкой продвижения по службе

Prvalue типа float могут быть преобразованы в prvalue типа double. Значение не меняется.
Оригинал:
A prvalue of type float can be converted to prvalue of type double. The value does not change.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Числовые преобразования

В отличие от акций, числовые преобразования могут изменять значения, с потенциальной потерей точности.
Оригинал:
Unlike the promotions, numeric conversions may change the values, with potential loss of precision.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Интегральных преобразований

Prvalue целого типа или незаданной типа перечисления может быть преобразовано в любое другое целое число типа. Если преобразования, перечисленные в интегральной акции, это поощрение, а не превращение.
Оригинал:
A prvalue of an integer type or of an unscoped enumeration type can be converted to any other integer type. If the conversion is listed under integral promotions, it is a promotion and not a conversion.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если целевой тип без знака, полученное значение является значением по модулю 2n
    где n это количество бит, используемых для представления конечного типа. В дополнение арифметическое 2 в (используется на всех платформах, где C + + компиляторов имеются), это преобразование не-оп, за исключением усечение, если пункт назначения типа является маленький.
    Оригинал:
    If the destination type is unsigned, the resulting value is the value modulo 2n
    where n is the number of bits used to represent the destination type. In 2's complement arithmetic (used on all platforms where C++ compilers are available), this conversion is a no-op, except for the truncation if the destination type is to small.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если целевой тип подписан, значение не изменяется, если источник число может быть представлено в пункт назначения типа. В противном случае результат зависит от реализации.
    Оригинал:
    If the destination type is signed, the value does not change if the source integer can be represented in the destination type. Otherwise the result is implementation-defined.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если исходный тип bool, значение false превращается в нуль, а значение true преобразуется в значение одного из назначения типа (обратите внимание, что если пункт назначения типа int, это целое продвижение по службе, не является целым числом преобразования)
    Оригинал:
    If the source type is bool, the value false is converted to zero and the value true is converted to the value one of the destination type (note that if the destination type is int, this is an integer promotion, not an integer conversion)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если целевой тип bool, это логическое преобразование (см. ниже)
    Оригинал:
    If the destination type is bool, this is a boolean conversion (see below)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] С плавающей точкой преобразования

Prvalue из типа с плавающей точкой могут быть преобразованы в prvalue любого другого типа с плавающей точкой. Если преобразования, перечисленные в с плавающей точкой акциях, это поощрение, а не превращение.
Оригинал:
A prvalue of an floating-point type can be converted to prvalue of any other floating-point type. If the conversion is listed under floating-point promotions, it is a promotion and not a conversion.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если исходное значение может быть представлено точно в пункт назначения типа, это не меняет.
    Оригинал:
    If the source value can be represented exactly in the destination type, it does not change.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если исходное значение находится между двумя представимых значений конечного типа, то результат будет один из этих двух значений (она определяется реализацией которого один)
    Оригинал:
    If the source value is between two representable values of the destination type, the result is one of those two values (it is implementation-defined which one)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • В противном случае, поведение не определено.
    Оригинал:
    Otherwise, the behavior is undefined.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Плавающая - неотъемлемая преобразований

  • Prvalue с плавающей точкой типа могут быть преобразованы в prvalue любого целого типа. Дробная часть обрезается, то есть дробная часть отбрасывается. Если значение не может вписаться в целевой тип, поведение не определено. Если целевой тип bool, это логическое преобразование (см. ниже).
    Оригинал:
    A prvalue of floating-point type can be converted to prvalue of any integer type. The fractional part is truncated, that is, the fractional part is discarded. If the value can not fit into the destination type, the behavior is undefined. If the destination type is bool, this is a boolean conversion (see below).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Prvalue целых или незаданной типа перечисления может быть преобразован в prvalue любого типа с плавающей точкой. Если значение не может быть представлена ​​правильно, это реализация определена ли ближайшая выше или ниже ближайшего представимо значение будет выбрано. Если значение не может вписаться в целевой тип, поведение не определено. Если исходный тип bool, значение false превращается в нуль, а значение true превращается в один.
    Оригинал:
    A prvalue of integer or unscoped enumeration type can be converted to prvalue of any floating-point type. If the value can not be represented correctly, it is implementation defined whether the closest higher or the closest lower representable value will be selected. If the value can not fit into the destination type, the behavior is undefined. If the source type is bool, the value false is converted to zero, and the value true is converted to one.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Указатель преобразования

  • Указатель' нулевой постоянной NULL или любой другой prvalue интегрального типа, который оценивается в ноль или любое prvalue типа std::nullptr_t, в том числе указатель' нулевые буквальном nullptr, могут быть преобразованы в любой тип указателя, и в результате нулевое значение указателя этого типа. Такое преобразование (известный как "нулевые преобразования указателей допускается преобразования малыш резюме квалифицированных типа как единого преобразования, то есть, это не считается сочетание цифровой и квалификационные преобразования).
    Оригинал:
    The null pointer constant NULL or any other prvalue of integral type that evaluates to zero or any prvalue of type std::nullptr_t, including the null pointer literal nullptr, can be converted to any pointer type, and the result is the null pointer value of that type. Such conversion (known as 'null pointer conversion is allowed to conver tot a cv-qualified type as a single conversion, that is, it's not considered a combination of numeric and qualifying conversions).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Prvalue указатель на любой (необязательно резюме квалифицированных) объекта T типа может быть преобразован в указатель на prvalue (тождественно резюме квалифицированных) void. Если T не фактический тип, то к объекту, в результате указатель доводят до указывают на начало хранения занимают наиболее объект, производный. Если исходный указатель является нулевое значение указателя, в результате нулевое значение указателя назначения типа.
    Оригинал:
    A prvalue pointer to any (optionally cv-qualified) object type T can be converted to a prvalue pointer to (identically cv-qualified) void. If T is not the runtime type of the pointed-to object, the resulting pointer is adjusted to point to the start of the storage occupied by the most-derived object. If the original pointer is a null pointer value, the result is a null pointer value of the destination type.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Prvalue указатель (опционально резюме квалифицированных) тип производного класса может быть преобразован в prvalue указатель на его доступным, однозначные (тождественно резюме квалифицированных) базового класса. Результатом преобразования является указателем на подобъектов базового класса в пределах, то к объекту. Нулевое значение указателя превращается в нулевое значение указателя назначения типа.
    Оригинал:
    A prvalue pointer to a (optionally cv-qualified) derived class type can be converted to prvalue pointer to its accessible, unambiguous (identically cv-qualified) base class. The result of the conversion is a pointer to the base class subobject within the pointed-to object. The null pointer value is converted to the null pointer value of the destination type.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Указатель на член преобразований

  • Указатель' нулевой постоянной NULL или любой другой prvalue интегрального типа, который оценивается в ноль или любое prvalue типа std::nullptr_t, в том числе указатель' нулевые буквальном nullptr, могут быть преобразованы в любой указатель на тип элемента, и в результате нулевое значение указателя этого типа. Такое преобразование (известный как "нулевые преобразования указателей допускается преобразования малыш резюме квалифицированных типа как единого преобразования, то есть, это не считается сочетание цифровой и квалификационные преобразования).
    Оригинал:
    The null pointer constant NULL or any other prvalue of integral type that evaluates to zero or any prvalue of type std::nullptr_t, including the null pointer literal nullptr, can be converted to any pointer-to-member type, and the result is the null pointer value of that type. Such conversion (known as 'null pointer conversion is allowed to conver tot a cv-qualified type as a single conversion, that is, it's not considered a combination of numeric and qualifying conversions).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Prvalue указатель на член того или иного типа T в B базовый класс может быть преобразован в prvalue указатель на член того же типа T в его производных D класса. Если B недоступна, неоднозначный, или виртуальную базу D или является базой некоторой промежуточной виртуальной базы D, преобразования плохо сформированные (не компилируется). В результате указателя может быть разыменован с D объект, и он будет иметь доступ членов в подобъекта B базы, что D объекта. Нулевое значение указателя превращается в нулевое значение указателя назначения типа.
    Оригинал:
    Prvalue pointer to member of some type T in a base class B can be converted to prvalue pointer to member of the same type T in its derived class D. If B is inaccessible, ambiguous, or virtual base of D or is a base of some intermediate virtual base of D, the conversion is ill-formed (won't compile). The resulting pointer can be dereferenced with a D object, and it will access the member within the B base subobject of that D object. The null pointer value is converted to the null pointer value of the destination type.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Булевых преобразований

Prvalues ​​интегральных с плавающей точкой, незаданной перечисления, указатель и указатель на член типа могут быть преобразованы в prvalues ​​типа bool.
Оригинал:
Prvalues of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to prvalues of type bool.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Нулевое значение (для целых, с плавающей точкой, а незаданной перечисления) и нулевого указателя и нулевого указателя на член ценности становятся false. Все остальные значения становятся true.
Оригинал:
The value zero (for integral, floating-point, and unscoped enumeration) and the null pointer and the null pointer-to-member values become false. All other values become true.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Prvalue типа std::nullptr_t, в том числе nullptr, могут быть преобразованы в prvalue типа bool. Полученное значение false. (начиная с C++11)
Оригинал:
Prvalue of type std::nullptr_t, including nullptr, can be converted to prvalue of type bool. The resulting value is false. (начиная с C++11)
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Квалификация преобразований

  • Prvalue тип указателя на член резюме квалифицированных T типа в классе X могут быть преобразованы в prvalue указатель на член больше резюме квалифицированных типа T в классе X.
    Оригинал:
    A prvalue of type pointer to member of cv-qualified type T in class X can be converted to prvalue pointer to member of more cv-qualified type T in class X.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
"More" резюме квалифицированных означает, что
Оригинал:
"More" cv-qualified means that
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • ' Неквалифицированный тип может быть преобразован в const
    Оригинал:
    unqualified type can be converted to const
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • ' Неквалифицированный тип может быть преобразован в volatile
    Оригинал:
    unqualified type can be converted to volatile
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • ' Неквалифицированный тип может быть преобразован в const volatile
    Оригинал:
    unqualified type can be converted to const volatile
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • const типа могут быть преобразованы в const volatile
    Оригинал:
    const type can be converted to const volatile
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • volatile типа могут быть преобразованы в const volatile
    Оригинал:
    volatile type can be converted to const volatile
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Для многоуровневых указателей, применяются следующие ограничения:
Оригинал:
For multi-level pointers, the following restrictions apply:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Многоуровневых P1 указатель, который является cv1
0
квалифицированных указатель на cv1
1
квалифицированных указатель на... cv1
n-1
квалифицированных указатель на cv1
n
квалифицированных T можно преобразовать в многоуровневый P1 указатель, который является cv2
0
квалифицированных указатель на cv2
1
квалифицированных указатель на... cv2
n-1
квалифицированных указатель на cv2
n
квалифицированных T только если
Оригинал:
A multilevel pointer P1 which is cv1
0
-qualified pointer to cv1
1
-qualified pointer to ... cv1
n-1
-qualified pointer to cv1
n
-qualified T is convertible to a multilevel pointer P1 which is cv2
0
-qualified pointer to cv2
1
-qualified pointer to ... cv2
n-1
-qualified pointer to cv2
n
-qualified T only if
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Число n уровней одинаковы для обоих указателей
    Оригинал:
    The number of levels n is the same for both pointers
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если есть const в cv1
    k
    квалификации на определенном уровне (кроме нулевого уровня) P1, есть const в том же cv2
    k
    уровне P2
    Оригинал:
    If there is a const in the cv1
    k
    qualification at some level (other than level zero) of P1, there is a const in the same level cv2
    k
    of P2
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если есть volatile в cv1
    k
    квалификации на определенном уровне (кроме нулевого уровня) P1, есть volatile в том же cv2
    k
    level Р2
    Оригинал:
    If there is a volatile in the cv1
    k
    qualification at some level (other than level zero) of P1, there is a volatile in the same cv2
    k
    level of P2
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если на каком-то уровне k CV-квалификации различаются между P1 и P2, то должно быть константным в каждом уровне (кроме уровня нуля) P2 до K: cv2
    1
    , cv2
    2
    ... cv2
    k
    .
    Оригинал:
    If at some level k the cv-qualifications are different between P1 and P2, then there must be a const at every single level (other than level zero) of P2 up until k: cv2
    1
    , cv2
    2
    ... cv2
    k
    .
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Те же правила применяются к многоуровневых указателей на члены и многоуровневые смешанные указателей на объекты и указатели на члены.
    Оригинал:
    Same rules apply to multi-level pointers to members and multi-level mixed pointers to objects and pointers to members.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Уровень нуля рассмотрены правила для не-многоуровневая преобразования квалификации.
    Оригинал:
    Level zero is addressed by the rules for non-multilevel qualification conversions.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
В частности, это запрещает переход от T** в const T**, но преобразование в const T* const* разрешено.
Оригинал:
In particular, this forbids the conversion from T** to const T**, but conversion to const T* const* is allowed.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Безопасный BOOL проблемы

До введения явных функций преобразования в C + +11, проектирование класс, должны быть доступны в логический контекст (например, if(obj) { ... представляет собой проблему: при определенной пользователем функции преобразования, такие как T::operator bool() const;, неявные преобразования последовательностей позволило дополнительных стандартных Преобразование последовательности после этого вызова функции, что означает, что результирующая bool может быть преобразован в int, позволяя таким кодом, как obj << 1; или int i=test;.
Оригинал:
Until the introduction of explicit conversion functions in C++11, designing a class that should be usable in boolean contexts (e.g. if(obj) { ... presented a problem: given a user-defined conversion function, such as T::operator bool() const;, the implicit conversion sequence allowed one additional standard conversion sequence after that function call, which means the resultant bool could be converted to int, allowing such code as obj << 1; or int i=test;.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Одним из первых решений для этого можно увидеть в std::basic_ios, который определяет operator! и operator void*()(до C++11), так что код таких как if(std::cin) {... компилирует, потому что void* конвертируется в bool, но int n = std::cout; не компилируется, потому что void* не конвертируемых в int. Это еще ерунда позволяет кодом, таких как delete std::cout; для компиляции, и многие заранее C + +11 сторонних библиотек были разработаны с более сложные решения, известные как Safe Bool idiom.
Оригинал:
One early solution for this can be seen in std::basic_ios, which defines operator! and operator void*()(до C++11), so that the code such as if(std::cin) {... compiles because void* is convertible to bool, but int n = std::cout; does not compile because void* is not convertible to int. This still allows nonsense code such as delete std::cout; to compile, and many pre-C++11 third party libraries were designed with a more elaborate solution, known as the Safe Bool idiom.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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