Je suis assez novice en C++ mais je trouve ce comportement de auto
bizarre :
class A{};
int main() {
A a;
auto x = -(sizeof(a));
cout << x << endl;
return 0;
}
La variable x est unsigned
dans ce cas bien que j'ai utilisé l'opérateur unaire moins à l'initialisation de la variable. Comment se fait-il que seul le type de retour de sizeof
( std::size_t
) est pris en compte mais pas le fait que le nombre stocké sera négatif à cause de l'opérateur utilisé ?
Je suis au courant de size_t
étant un int non signé.
J'ai essayé cela avec GCC 8.1.0 et C++17.
9 votes
Pourquoi vous attendriez-vous à quelque chose de différent ? La même chose se produit lorsque vous faites
cout << -(sizeof(a)) << endl;
. Cela n'a rien à voir avec l'automobile.0 votes
Je pensais que
auto
ne se contente pas de respecter le type de retour, mais effectue une sorte de vérification du contexte, comme la vérification de l'opérateur unaire moins ou tout ce qui se passe dans le processus d'initialisation.5 votes
Parce que les concepteurs de C voulaient
-
pour être valide sur les valeurs non signées. Personnellement, je l'aurais rendu invalide.10 votes
C'est peut-être un malentendu sur
auto
il n'ajoute rien de nouveau au langage C++, il utilise le même mécanisme que celui qui était déjà présent dans le langage pour la déduction des types d'arguments des modèles.0 votes
J'ai ajouté des balises, mais aucune concernant auto, la déduction de type, le modèle, car il s'agit d'un problème arithmétique et non d'un problème de modèle. Mais auto est défini en termes de modèles.
0 votes
@JohannesSchaub-litb Quels opérateurs autoriseriez-vous pour les non signés ?
1 votes
@curiousguy tout sauf le moins unaire. En disant
0u - x
vous pouvez obtenir le même effet que-x
. Peut-être même que j'interdirais de mélanger la signature et la non-signature dans les expressions d'opérateurs. IMO, il pourrait être utile de permettre encore-1u
donc je pourrais ajouter une règle selon laquelle le moins unaire sur les non signés n'est autorisé que sur les littéraux non signés, ce qui est en quelque sorte similaire à l'interdiction de mélanger la signature dans les expressions d'opérateurs.0 votes
@JohannesSchaub-litb Donc la soustraction de nombres non signés, qui est modulo, est OK, mais pas la négation ?
2 votes
@curiousguy oui car le wrap-around est juste un cas spécial pour la soustraction. Ce n'est que si la droite est > à la gauche que l'on a un wrap around. Pour la négation par contre, le wrap around est la majorité des cas, avec seulement
0
étant l'exception.1 votes
BTW, pas besoin de toutes ces parenthèses inutiles -
- sizeof a
démontre le comportement tout aussi efficacement.