common_type<long, unsigned long>::type
unsigned long
ist, weil in Bezug auf die Operanden nach integraler Förderung des Standard sagt ...Warum ist common_type <long, unsigned long> :: type = long lang nicht?
[...], wenn die Operanden, die unsigned integer Typen hat haben Rang größer oder gleich den Rang des Typs des anderen Operanden, die Operanden mit integer-Typ unterzeichnet wird mit unsigned integer Typ
Nicht rufen sie die integrale Förderung System fehlerhaft, aber es scheint, wie der Art des Operanden umgewandelt werden, wenn es eine größere signed Integer Typ wh Ich kann den Bereich von sowohl signierten als auch vorzeichenlosen Operanden darstellen, die verwendet werden sollten.
Ich weiß, dass einige Plattformen könnten lange == lange lange, wobei in diesem Fall die obige Regel wirksam werden. Aber wenn es ein größerer unterzeichnete integralen Typen verfügbar ist, sollte es nicht verwendet werden?
Ich glaube nicht, dass es keine Garantie ist, dass 'lange long' den gesamten Bereich der' unsigned long' umfassen wird. Wenn es wie der Rest der Größenspezifikationen ist, ist die einzige Anforderung, dass es mit mindestens so vielen Bits wie "lang" dargestellt wird. Die Typ-Promotion sollte sich unabhängig von der Plattform einheitlich verhalten, daher gibt es eine gewisse Vorhersagbarkeit hinsichtlich der Überladungsauflösung. – jpm
'std :: common_type' stimmt mit den Regeln zur Bestimmung des Rückgabetyps des ternären Operators überein. In diesem Licht erscheint es offensichtlich falsch, dass der ternäre Operator einen Typ zurückgibt, der größer ist als jeder seiner beiden Zweige. –
@KevinBallard Ich glaube nicht, dass das offensichtlich falsch scheint.Einen Typ zurückzugeben, der größer ist als jeder seiner Zweige, wenn die Zweige unterschiedlich signiert zurückkommen, scheint das einzige zu sein, was garantiert fehlerfrei ist. – David