8
votes

Commande d'évaluation de la fonction C ++ dans l'opérateur d'affectation

void main() {
   vec.resize( 2 );
   int a = foobar();
   vec[0] = a;
}

3 commentaires

+2, c'est une question intéressante; C'est quelque chose que je n'ai jamais envisagé auparavant. Évidemment, vous avez des problèmes si vous commencez à utiliser le code comme celui de toute façon :)


+1. C'est vraiment une question intéressante; Plus que cela, la question est posée très bien. Une question bien écrite.


Je suis tombé sur un exemple intéressant de cela aujourd'hui: auto_ptr p (nouveau int); smart_map m; m [1] = p.Release (); si vous supposez que smart_map :: opérateur [] peut lancer, vous pouvez avoir un cas où le auto_ptr libère sa propriété, mais la carte n'assume jamais la propriété, dans le cas où le RHS est évalué avant le LHS. (Supposons smart_map est comme une carte STL , sauf qu'il supprime la valeur du pointeur de chaque paire de clé / valeur sur la destruction.)


3 Réponses :


8
votes

L'ordre d'évaluation serait indéterminé dans ce cas. N'écrivez pas ce code

EXEMPLE SIMILAIRE 0 commentaires


0
votes

L'ordre d'évaluation d'une expression est comportement non spécifié .
Cela dépend du compilateur qui commande qu'elle choisit d'évaluer.

Vous devez vous abstenir d'écrire des codes shuch.
Bien que s'il n'y ait pas d'effet secondaire, l'ordre n'aurait pas d'importance.

Si la commande compte, alors votre code est faux / non portable / peut donner un résultat différent Accross Différents compilateurs **.


0 commentaires

6
votes

Le concept de C ++ qui régit si l'ordre d'évaluation est défini est appelé point de séquence .

Fondamentalement, à un point de séquence, il est garanti que toutes les expressions avant ce point (avec des effets secondaires observables) ont été évaluées et qu'aucune expression dépassant ce point n'a encore été évaluée.

Bien que certains puissent le trouver surprenant, l'opérateur d'affectation n'est pas un point de séquence. Une liste complète de tous les points de séquence se trouve dans le Article Wikipedia .


1 commentaires

... était appelé le point de séquence. Depuis cette année, nous utilisons séquencé avant / séquencé après .