Приведение типов
От: NeoCode  
Дата: 27.02.14 13:45
Оценка: -1
Пытаюсь систематизировать операторы приведения типов. На примере С/С++ и подобных языков "среднего" уровня.

В С++ есть 5 способов приведения типов — один сишный и 4 оператора cast.
Понятно что сишный остался ради совместимости, он неудобен тем что очень сложно его искать в коде (нет ключевого слова), т.е. с точки зрения дизайна языка такой оператор нежелателен.
А какое количество операторов приведения типов вы считаете разумным, если бы мы могли перепроектировать С++ заново?

Очевидно, что должен быть оператор динамического приведения (dynamic_cast), который проверяет возможность приведения, используя дополнительную информацию.
Но: такой оператор может возвразать null (нулевой указатель или в общем случае значение по умолчанию типа, к которому приводим), а может выкидывать исключение. То есть уже как-бы два оператора.

Статическое преобразование типа.
Должен быть некий "тривиальный" оператор, который явно приводит то, что компилятор неявно приводить не хочет. Аналог static_cast и частично приведения в стиле Си.
Фактически — приведение для устранения ворнингов (не ошибок). Расширение типа (из int в double), потеря точности (из double в int), во всех случаях когда есть возможность явного преобразования но нет возможности неявного и т.п.

reinterpret_cast.
Вероятно, должен быть некий сверхнизкоуровневый оператор для приведения через область памяти (чего угодно к чему угодно). Мало ли.

С константностью:
Как я понимаю, идеологически правильнее иметь два типа константности: истинную (объект создается один раз и далее его невозможно изменить никогда) и локальную (явно запрещаем изменять объект в данном контексте). Если обратиться к языку D, то первое — это immutable, второе — const. Хотя я бы сказал что второе это "readonly".
В связи с этим для преобразования из immutable в изменяемый объект — только reinterpret_cast (реально низкоуровневый оператор для хакерских целей). Можно, например, обратиться к памяти и попытаться изменить константный литерал.

Для снятия readonly — должен быть какой-то отдельный оператор типа const_cast. Это более серьезно чем статическое приведение, это не динамическое приведение, и это менее серьезно чем reinterpret_cast.

Получается, что кажущаяся довольно громоздкой система приведения типов в С++ тем ни менее достаточно продумана. Или нет? Какие есть нюансы, которые не учтены в С++, которы я здесь не учел?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.