Комментарий Нила довольно точен. Бьярне упомянул, рассматривая и отвергая эту точную возможность 1 :
Синтаксис инициализатора раньше
незаконно для встроенных типов. Позволять
это я ввел понятие, что
встроенные типы имеют конструкторы и
деструкторов. Например:
int a(1); // pre-2.1 error, now initializes a to 1
Я подумал распространить это понятие на
разрешить вывод из встроенных классов
и явное объявление встроенного
операторы для встроенных типов. Тем не мение,
Я сдержался.
Разрешение
вывод из int
не
на самом деле дать программист C ++
ничего значительно нового по сравнению с
имеющий int
член. Это
прежде всего потому, что int
не имеет
любые виртуальные функции для производных
класс для переопределения. Более серьезно
хотя, правила преобразования C так
хаотично, притворяясь, что int
,
short
и т. Д. Ведут себя хорошо
обычные занятия не идут на работу.
Они либо С совместимы, либо они
подчиняться относительно хорошо себя ведет C ++
правила для классов, но не для обоих.
Насколько комментарий оправдывает не делать int классом, это (по крайней мере, в основном) неверно. В Smalltalk все типы являются классами, но почти во всех реализациях Smalltalk есть оптимизации, поэтому реализация может быть практически идентична тому, как вы работали бы с неклассовыми типами. Например, класс smallInteger представляет 15-разрядное целое число, а сообщение «+» жестко запрограммировано в виртуальной машине, поэтому даже если вы можете получить из smallInteger, оно все равно дает производительность, аналогичную встроенному типу ( хотя Smalltalk достаточно отличается от C ++, что прямые сравнения производительности трудны и вряд ли будут много значить).
Один бит, который «теряется» в реализации Smalltalk для smallInteger (причина, по которой он представляет только 15 бит вместо 16), вероятно, не понадобится в C или C ++. Smalltalk немного похож на Java - когда вы «определяете объект», вы на самом деле просто определяете указатель на объект, и вам нужно динамически выделить объект, на который он будет указывать. То, чем вы манипулируете, передаете функцию в качестве параметра и т. Д., Всегда является просто указателем, а не самим объектом.
Это , а не , как реализовано smallInteger - в его случае целочисленное значение помещается непосредственно в то, что обычно будет указателем. Чтобы различать smallInteger и указатель, они заставляют все объекты размещаться на границах четных байтов, поэтому LSB всегда чист. У smallInteger всегда установлен LSB.
Большая часть этого необходима, однако, потому что Smalltalk динамически типизирован - он должен иметь возможность выводить тип, просматривая само значение, а smallInteger в основном использует этот LSB в качестве тега типа. Учитывая, что C ++ является статически типизированным, никогда не требуется выводить тип из значения, поэтому вам, вероятно, не нужно будет «тратить» этот бит на тег типа.
1. В Дизайн и развитие C ++ , §15.11.3.