Neil commentaire est très précis. Bjarne mentionné en considérant et en rejetant cette possibilité1:
L'initialiseur de syntaxe utilisée pour être
illégal pour les types intégrés. Pour permettre
c', j'ai introduit la notion que
construit-dans les types de constructeurs et
les destructeurs. Par exemple:
int a(1); // pre-2.1 error, now initializes a to 1
J'ai envisagé d'étendre cette notion à
permettre la dérivation de classes intégrées
et une déclaration explicite de
les opérateurs de type intégré. Cependant,
Je me suis retenu.
Permettant
la dérivation à partir d'un int
n'a pas
effectivement donner un programmeur C++
rien de manière significative de nouveau par rapport à
avoir un int
membre. C'est
principalement parce que l' int
n'ont pas
toutes les fonctions virtuelles pour les dérivés
classe remplacer. Plus sérieusement
cependant, le C des règles de conversion sont donc
chaotique que de prétendre qu' int
,
short
, etc., sont bien comportés
les classes ordinaires est pas d'aller travailler.
Ils sont soit C compatible, ou qu'ils
obéir à la relativement bien comportés C++
règles pour les classes, mais pas les deux.
Autant que le commentaire de la performance justifie pas faire int une classe, c'est (au moins pour la plupart) faux. En Smalltalk, tous les types sont les classes-mais près de toutes les implémentations du langage Smalltalk ont optimisations de sorte que la mise en œuvre peut être essentiellement identique à la façon dont vous ferais un non-class type de travail. Par exemple, le smallInteger classe représente 15 bits entier, et le '+' message est codé en dur dans la machine virtuelle, de sorte que même si vous pouvez tirer de smallInteger, il donne toujours des performances similaires à un type (bien que Smalltalk est assez différent de C++ qui dirigez l'exécution des comparaisons sont difficiles et il est peu probable beaucoup de sens).
Edit: un peu c'est "perdu" dans le langage Smalltalk mise en œuvre de smallInteger ne serait probablement pas nécessaire en C ou C++. Smalltalk est un peu comme Java -- lorsque vous "définir un objet" vous êtes vraiment seulement la définition d'un pointeur vers un objet, et vous devez allouer dynamiquement un objet pour qu'il point. Ce que vous manipuler, transmettre à une fonction comme paramètre, etc., c'est toujours juste le pointeur, pas de l'objet lui-même.
C'est pas comment smallInteger est mis en œuvre -- il y a dans son cas, ils ont mis la valeur de l'entier directement dans ce qui serait normalement le pointeur. Pour faire la distinction entre un smallInteger et un pointeur, ils ont la force de tous les objets alloués à même les limites d'octets, de sorte que le LSB est toujours clair. Un smallInteger a toujours le LSB ensemble.
La plupart de ce qui est nécessaire, cependant, parce que Smalltalk est dynamiquement typé, il doit être en mesure de déduire le type en regardant la valeur elle-même, et smallInteger est essentiellement l'aide que LSB type de balise. Étant donné que C++ est statiquement typé, il n'y a pas besoin d'en déduire le type de la valeur, de sorte que vous ne serait probablement pas besoin de perdre un peu.
1 Dans La Conception et l'Évolution de C++, §15.11.3.