R.5.4 Явное преобразование типа
Явное преобразование типа можно задать с помощью функциональной
записи ($$R.5.2.3) или с помощью операции приведения.
выражение-приведения:
унарное-выражение
( имя-типа ) выражение-приведения
Задание с помощью операции приведения используется для обозначения
преобразования к типу, который не является конструкцией
имя-простого-типа.
В операции приведения нельзя определять типы.
Всякое преобразование типа, не упомянутое здесь и не являющееся
преобразованием явно определенным пользователем ($$R.12.3), считается
ошибкой.
Любой тип, который можно преобразовать в другой с помощью
стандартного преобразования ($$R.4), можно также преобразовать
с помощью явного преобразования (приведения) и смысл преобразования
будет тот же.
Указатель можно преобразовать к любому целочисленному типу,
достаточно большому, чтобы вместить значение указателя. Алгоритм
преобразования зависит от реализации, но предполагается, что он
будет естественным для того, кто знает систему адресации, используемой
машины.
Значение целочисленного типа может быть явно преобразовано в
указатель. Указатель, преобразованный в целое достаточного размера
(если такие есть в реализации), и преобразованный обратно к типу
указателя, должен иметь свое первоначальное значение. Все другие
детали перевода указателя в целое и обратно зависят от реализации.
Указатель на объект одного типа может быть преобразован в
указатель на объект другого типа (с соблюдением ограничений, указанных
здесь). Использование получившегося указателя может вызвать
особую адресную ситуацию ("неверный адрес"), если преобразуемый
указатель не
настроен на объект, правильным образом выравненный в памяти.
Гарантируется, что указатель на объект данного размера можно
преобразовать в указатель на объект равного или меньшего размера
и провести обратное преобразование без изменения значения указателя.
На различных машинах двоичное представление указателей может быть
различно как и требования на выравнивания объектов. Составные
объекты выравниваются по самой строгой границе, требуемой их
составляющими. Указатель типа void* считается совместимым с
указателем на объект любого типа.
Указатель на класс B можно преобразовать в указатель на класс D,
для которого класс B является прямо или опосредованно базовым
классом, если существует однозначное преобразование из D в B
($$R.4.6, $$.R10.1.1) и если B является виртуальным базовым классом
($$R.10.1). Такое приведение от базового класса к производному
классу предполагает, что объект базового класса является вложенным
по отношению к объекту производного класса. В результате получится
указатель, настроенный на объемлющий объект производного класса.
Если объект базового класса не содержится ни в каком объекте
производного класса, такая операция приведения может вызвать
особую ситуацию.
Пустой указатель (0) преобразуется сам в себя.
Пока еще неопределенный класс можно использовать в операции
приведения указателя, в этом случае никаких допущений о структуре
класса не делается ($$R.10.1).
Любой объект можно явно преобразовать к типу ссылки X&, если
указатель на этот объект можно явно преобразовать в тип X*.
В результате приведения к ссылке не происходит вызовов конструкторов
или функций преобразований. Преобразование ссылки на базовый класс
в ссылку на производный класс рассматривается аналогично
преобразованию указателя на базовый класс в указатель на
производный класс, учитывая вопросы однозначности, виртуальных
классов и т.д.
Результатом приведения к ссылке является адрес, в отличие от всех
остальных приведений. Результат приведения указателя или ссылки
настроен на тот же объект, что и исходное выражение без операции
приведения.
Указатель на функцию можно явно преобразовать в указатель на
некоторый объект при условии, что тип указателя на этот объект
достаточно велик, чтобы хранить указатель на функцию. Указатель
на некоторый объект можно явно преобразовать в указатель на функцию
при условии, что тип указателя на функцию достаточно велик, чтобы
хранить указатель на этот объект. В обоих случаях, использование
указателя, получившегося в результате преобразования, может
вызвать особую адресную ситуацию, или что-нибудь похуже,
если исходный указатель не настроен на соответствующий объект.
Указатель на функцию одного типа можно явно преобразовать в
указатель на функцию другого типа. Результат вызова функции с
помощью указателя на функцию, тип которой отличен от типа,
использованного при определении первой функции, неопределен
(см. так же $$R.4.6).
Объект или значение можно преобразовать в объект типа класс
только при условии, что определен подходящий конструктор или
операция преобразования ($$R.12.3).
Указатель на член можно явно преобразовать в указатель на другой
член, если оба участвующих типа являются типами указателей
на члены одного класса, или, если оба типа являются указателями
на функцию-член классов, один из которых получается как однозначное
производное от другого ($$R.4.8).
Указатель на объект с типом, имеющим спецификацию const, можно
привести к указателю с типом без спецификации const. Получившийся
в результате указатель будет настроен на исходный объект.
Объект с типом, имеющим спецификацию const, или ссылку на объект
такого типа можно привести в ссылку на объект с типом без const.
Получившаяся в результате ссылка будет настроена на исходный
объект. В результате попытки изменить этот объект с помощью
такой ссылки или указателя может возникнуть особая ситуация или
он будет таким же, как при обращении с помощью исходной ссылки
или указателя к объекту, тип которого не содержит const. Возникнет
ли особая адресная ситуация зависит от реализации.
Указатель на объект типа со спецификацией volatile можно привести
к указателю на объект типа без volatile. В результате получится
указатель, настроенный на исходный объект. Объект типа с volatile
или ссылку на такой объект можно привести к ссылке на объект с типом
без volatile.
- * Справочное руководство r.1 Введение
- R.1.1 Обзор
- R.1.2 Запись синтаксиса
- R.2 Соглашения о лексических понятиях
- R.2.1 Лексемы
- R.2.3 Идентификаторы
- R.2.4 Служебные слова
- R.2.5 Литералы
- R.2.5.1 Целые константы
- R.2.5.2 Символьные константы
- R.2.5.3 Константы с плавающей точкой
- R.2.5.4 Строки литералов
- R.3 Основные понятия
- R.3.1 Описания и определения
- R.3.2 Область видимости
- R.3.3 Программа и связывание
- R.3.4 Начало и окончание программы
- R.3.5 Классы памяти
- R.3.6 Типы
- R.3.6.1 Основные типы
- R.3.6.2 Производные типы
- R.3.6.3 Имена типов
- R.3.7 Адреса
- R.4 Стандартные преобразования
- R.4.1 Стандартные преобразования для целочисленных
- R.4.2 Преобразования целочисленных
- R.4.3 Значения с плавающей точкой и двойной точностью
- R.4.4 Целочисленные и числа с плавающей точкой
- R.4.6 Преобразования указателей
- R.4.7 Преобразования ссылок
- R.4.8 Указатели на члены
- R.5 Выражения
- R.5.1 Первичные выражения
- R.5.2 Постфиксные выражения
- R.5.2.1 Индексация
- R.5.2.2 Вызов функции
- R.5.2.3 Явные преобразования типа
- R.5.2.4 Доступ к члену класса
- R.5.2.5 Инкремент и декремент
- R.5.3 Унарные операции
- R.5.3.1 Инкремент и декремент
- R.5.3.2 Операция sizeof
- R.5.3.3 Операция new
- R.5.3.4 Операция delete
- R.5.4 Явное преобразование типа
- R.5.5 Операции указатель-на-член
- R.5.6 Мультипликативные операции
- R.5.8 Операции сдвига
- R.5.9 Операции отношения
- R.5.10 Операции сравнения на равенство
- R.5.11 Поразрядная операция и
- R.5.12 Поразрядная (исключающая) операция или
- R.5.13 Поразрядная (включающая) операция или
- R.5.14 Логическая операция и
- R.5.15 Логическая операция или
- R.5.16 Операция условия
- R.5.17 Операции присваивания
- R.5.18 Операция запятая
- R.5.19 Выражения-константы
- R.6 Операторы
- R.6.1 Помеченный оператор
- R.6.2 Оператор-выражение
- R.6.3 Составной оператор или блок
- R.6.4 Выбирающий оператор
- R.6.4.1 Оператор if
- R.6.4.2 Оператор переключателя
- R.6.5 Операторы цикла
- R.6.5.1 Оператор while
- R.6.5.2 Оператор do
- R.6.5.3 Оператор for
- R.6.6 Операторы перехода
- R.6.6.1 Оператор break
- R.6.6.2 Оператор continue
- R.6.6.3 Оператор return
- R.6.6.4 Оператор goto
- R.6.7 Оператор описания
- R.6.8 Разрешение неоднозначности
- R.7 Описания
- R.7.1 Спецификации
- R.7.1.1 Спецификации класса памяти
- R.7.1.2 Спецификации функций
- R.7.1.3 Спецификация typedef
- R.7.1.4 Спецификация шаблона типа
- R.7.1.5 Спецификация friend
- R.7.1.6 Спецификация типа
- R.7.2 Описание перечисления
- R.7.3 Описания asm
- R.7.4 Спецификации связи
- R.8 Описатели
- R.8.1 Имена типов
- R.8.1.1 Устранение неоднозначности
- R.8.2 Смысл описателей
- R.8.2.1 Указатели
- R.8.2.2 Ссылки
- R.8.2.3 Указатели на члены
- R.8.2.4 Массивы
- R.8.2.5 Функции
- R.8.3 Определения функций
- R.8.4 Инициализаторы
- R.8.4.1 Агрегат
- R.8.4.2 Символьные массивы
- R.8.4.3 Ссылки
- R.9 классы
- R.9.1 Имена класса
- R.9.2 Члены класса
- R.9.3 Функции-члены
- R.9.3.1 Указатель this
- R.9.3.2 Функции-члены со спецификацией inline
- R.9.4 Статические члены
- R.9.5 Объединения
- R.9.6 Битовые поля
- R.9.7 Вложенные описания классов
- R.9.8 Описания локальных классов
- R.9.9 Имена локальных типов
- R.10 Производные классы
- R.10.1 Множественные базовые классы
- R.10.1.1 Неоднозначности
- R.10.2 Виртуальные функции
- R.10.3 Абстрактные классы
- R.10.4 Сводка правил области видимости
- R.11 Контроль доступа к членам
- R.11.1 Спецификации доступа
- R.11.2 Спецификации доступа для базовых классов
- R.11.3 Описания доступа
- R.11.4 Друзья
- R.11.5 Доступ к защищенным членам
- R.11.6 Доступ к виртуальным функциям
- R.11.7 Множественный доступ
- R.12 Специальные функции-члены
- R.12.1 Конструкторы
- R.12.2 Временные объекты
- R.12.3 Преобразования
- R.12.3.1 Преобразование с помощью конструктора
- R.12.3.2 Функции преобразования
- R.12.4 Деструкторы
- R.12.5 Свободная память
- R.12.6 Инициализация
- R.12.6.1 Явная инициализация
- R.12.6.2 Инициализация членов и базовых классов
- R.12.7 Конструкторы и деструкторы
- R.12.8 Копирование объектов класса
- R.13 Перегрузка
- R.13.1 Сопоставление описаний
- R.13.2 Сопоставление параметров
- R.13.3 Адрес перегруженной функции
- R.13.4 Перегруженные операции
- R.13.4.1 Унарные операции
- R.13.4.2 Бинарные операции
- R.14.2 Шаблоны типов для классов
- R.14.3 Эквивалентность типов
- R.14.4 Шаблоны типа для функций
- R.14.5 Описания и определения
- R.14.6 Функции-члены шаблонов типа
- R.14.7 Друзья
- R.14.8 Статические члены и переменные
- R.15 Обработка особых ситуаций r.15.1 Обработка особых ситуаций
- R.15.2 Запуск особой ситуации
- R.15.3 Конструкторы и деструкторы
- R.15.4 Обработка особой ситуации
- R.15.5 Спецификации особых ситуаций
- R.15.6 Специальные функции
- R.15.6.1 Функция terminate()
- R.15.6.2 Функция unexpected()
- R.15.7 Особые ситуации и правила доступа
- R.16 Препроцессорная обработка
- R.16.1 Фазы препроцессорной обработки
- R.16.2 Триграфные последовательности
- R.16.3 Макроопределение и макроподстановка
- R.16.3.1 Операция #
- R.16.3.2 Операция ##
- R.16.3.3 Повторный просмотр и дальнейшие подстановки
- R.16.3.4 Область видимости макроимен и конструкция #undef
- R.16.4 Включение файлов
- R.16.5 Условная трансляция
- R.16.6 Управление строками
- R.16.7 Команда error
- R.16.8 Команда pragma
- R.16.9 Пустая директива
- R.16.10 Предопределенные макроимена
- R.17 Приложение a: Сводка грамматики
- R.17.1 Служебные слова
- R.17.2 Выражения
- R.17.3 Описания
- R.17.4 Описатели
- R.17.5 Описания класса
- R.17.6 Операторы
- R.17.7 Препроцессор
- R.17.8 Шаблоны типа
- R.17.9 Обработка особых ситуаций
- R.18 Приложение b: Совместимость
- R.18.1 Расширения
- R.18.2.1 Как бороться с расхождениями
- R.18.3 Анахронизм
- R.18.3.1 Определения функций старого стиля
- R.18.3.4 Приведение указателей на функцию-член
- R.18.3.5 Невложенность классов
- Список служебных слов
- Указатель
- * Примеры *