• unsigned
), то результирующее значение будет иметь столько же битов, сколько и источник, при условии, что оно может поместиться в целевой области памяти (старшие биты при необходимости могут быть отброшены). Если целевой тип имеет знак, то значение останется без изменения, при условии, что его можно представить с помощью целевого типа; в противном случае значение определяется реализацией языка. Обратите внимание на то, что типы bool
и char
являются целочисленными.
• double
считается продвижением.
• void*
(см. разделы 17.8 и 27.3.5). Указатель (ссылка) на производный класс можно неявно преобразовать в указатель (ссылку) на доступный и однозначно определенный базовый класс (см. раздел 14.3). Константное выражение (см. разделы A.5 и 4.3.1), равное нулю, можно неявно преобразовать в любой другой тип указателя. Указатель типа T*
можно неявно преобразовать в указатель const T*
. Аналогично ссылку T&
можно неявно преобразовать в ссылку типа const T&
.
• bool
. Ненулевое значение преобразовывается в значение true
, а нуль — в значение false
.
•
•
1. Если один из операндов имеет тип long double
, то другой преобразовывается в тип long double
. В противном случае, если один из операндов имеет тип double
, другой преобразовывается в тип double
. В противном случае, если один из операндов имеет тип float
, другой преобразовывается в тип float
. В противном случае над обоими операндами целочисленного типа выполняется продвижение.
2. Если один из операндов имеет тип unsigned long
, то другой преобразовывается в тип unsigned long
. В противном случае, если один из операндов имеет тип long int
, а другой — unsigned int
, значение типа unsigned int
преобразуется в значение типа long int
, при условии, что тип long int
может представить все значения типа unsigned int
. В противном случае оба операнда преобразовываются в тип unsigned long int
. В противном случае, если один из операндов имеет тип long
, другой преобразовывается в тип long
. В противном случае, если другой операнд имеет тип unsigned
, другой преобразовывается в тип unsigned
. В противном случае оба операнда имеют тип int
.
Очевидно, что лучше не полагаться на слишком запутанные сочетания типов и минимизировать необходимость неявных преобразований.
A.5.2.3. Преобразования, определенные пользователем
Кроме стандартных преобразований и продвижений, программист может определить преобразования типов, определенных пользователем. Конструктор, принимающий один аргумент, определяет преобразование этого аргумента в значение своего типа. Если конструктор имеет спецификатор explicit
(см. раздел 18.3.1), то преобразование происходит, только если программист явно потребует его выполнить. В противном случае преобразование может быть неявным.
A.5.3. Константные выражения