Кроме арифметических, существует еще несколько видов неявных преобразований, включая следующие.
int ia[10]; //
int* ip = ia; //
Это преобразование не происходит при использовании массива в выражении decltype
или в качестве операнда операторов обращения к адресу (&
), sizeof
или typeid
(который рассматривается в разделе 19.2.2). Преобразование не происходит также при инициализации ссылки на массив (см. раздел 3.5.1). Подобное преобразование указателя происходит при использовании в выражении типа функции, как будет описано в разделе 6.7.
nullptr
могут быть преобразованы в указатель на любой тип; указатель на любой неконстантный тип может быть преобразован в void*
, а указатель на любой тип может быть преобразован в const void*
. Как будет продемонстрировано в разделе 15.2.2, существуют дополнительные преобразования указателя, относящиеся к типам, связанным наследованием.
bool
bool
. Если указатель или арифметическое значение — нуль, преобразование возвращает значение false
; любое другое значение возвращает true
:
char *cp = get_string();
if (cp) /* ... */ //
while (*cp) /* ... */ //
Преобразование в константу. Указатель на неконстантный тип можно преобразовать в указатель на соответствующий константный тип, то же относится и к ссылкам. Таким образом, если Т
— тип, то указатель или ссылку на тип T
можно преобразовать в указатель или ссылку на const Т
(см. разделы 2.4.1 и 2.4.2).
int i;
const int &j = i; //
const int *p = &i //
int &r = j, *q = p; //
// недопустимо
Обратное преобразование (устранение спецификатора const
нижнего уровня) невозможно.
В программах ранее уже использовались преобразования типов класса, когда символьная строка в стиле С использовалась там, где ожидался библиотечный тип string
(см. раздел 3.5.5), а также при чтении из потока istream
в условии.
string s, t = "a value"; // с
//
while (cin >> s) //
Условие (cin >> s
) читает поток cin
и возвращает его же как результат. Условия ожидают значение типа bool
, но оно проверяет значение типа istream
. Библиотека IO определяет преобразование из типа istream
в bool
. Это преобразование используется автоматически, чтобы преобразовать поток cin
в тип bool
. Результирующее значение типа bool
зависит от состояния потока. Если последнее чтение успешно, то преобразование возвращает значение true
. Если последняя попытка потерпела неудачу, то преобразование возвращает значение false
.
4.11.3. Явные преобразования
Иногда необходимо явно преобразовать объект в другой тип. Например, в следующем коде может понадобиться использование деления с плавающей точкой:
int i, j;
double slope = i/j;
Для этого необходим способ явного преобразования переменных i
и/или j
в тип double
. Для явного преобразования используется
Именованный оператор приведения имеет следующую форму: