2009-02-27 28 views
11

Quelqu'un peut-il me dire ce que cette distribution a pour effet (en plus de mettre happyNumber à 1337), le cas échéant, et si elle n'a aucun autre effet, comment puis-je écrire du code comme ça ??? Est-ce un bug de compilateur, ou une "fonctionnalité cachée" de C++?Qu'est-ce qui se passe avec static_cast avec plusieurs arguments?

int happyNumber = static_cast<int>(123.456, TRUE, "WTF" , false , "IS" , NULL , "GOING" , 0xff , "ON???" , 1337); 

J'ai été surpris que cela compilerait du tout. Je l'ai trouvé à travers un bug où j'ai accidentellement mis le deuxième paramètre à quelque chose qui devait aller dans un appel de fonction de l'expression en cours de distribution. Cela a entraîné un bogue méchant où l'objet a été moulé à partir du deuxième paramètre, appelant la fonction avec un seul argument. Il a compilé ... Et n'a pas boom de départ ...

J'utilise Microsoft Visual C++ 2008.

+0

C'est parfaitement légitime, et il n'y a pas de bug. – Anonymous

+0

Ah, oui vous avez raison. C'était tellement confus à moi alors que je * savais * que ça devait être un bug de compilateur - ce qui n'était pas le cas :) Je n'ai jamais rencontré l'opérateur virgule avant. – Statement

Répondre

30

fonte statique prend un argument, mais son argument est une expression, et les expressions peuvent inclure le comma operator. Comma est utilisé dans des situations où vous voulez évaluer deux ou plusieurs expressions à la fois pour leurs effets secondaires, par exemple:

int i, j; 
for (i=0, j=0; i < 10; i++,j++) { 
    // do stuff 
} 

Il est un peu utile, car sans elle, vous ne pouvez évaluer une expression chacun pour l'initialiseur, l'état et continuer les parties de la boucle for (ou tout autre endroit où une expression est attendue). Cependant, il ne fait généralement pas le code le plus clair, et la sémantique est étrange. Comme vous l'avez observé, une séquence séparée par des virgules évalue à la valeur de sa dernière expression.

+0

Je comprends l'utilisation de la syntaxe, mais je n'arrive pas à saisir la fonctionnalité dans un static_cast. – Statement

+0

Il n'y a pas de fonctionnalité. Vous faites juste quelques opérations en utilisant l'opérateur virgule et lancez le résultat. – Anonymous

+0

Ah, merci à vous et Ruben Je comprends maintenant comment cela fonctionne, et a appris quelque chose de nouveau :) – Statement