2017-10-09 13 views
-1

En compilant ceci:comportement gcc erronées avec lambda

#include <iostream> 
#include <sstream> 

std::string makeList (std::string sep) 
{ 
    auto makeItem = [&] (std::string item) 
    { 
     static char count = '0'; 
     return (++count, count) + sep + item + '\n'; 
    }; 

    return makeItem ("first") + makeItem ("second") + makeItem ("third"); 
} 

int main() 
{ 
    std::cout << makeList (". "); 
} 

avec gcc (5.4.0, C++ 11 drapeau) dont la sortie est la suivante:

3. first 
2. second 
1. third 

tandis que la sortie correcte, qui clang (3.8, C++ 11 drapeau) obtient, est:

1. first 
2. second 
3. third 

Y at-il une raison particulière pour ce comportement?

+5

Ordre d'évaluation des sous-expressions est indéterminée, ce qui signifie que votre compilateur peut choisir d'exécuter les 'makeItem' appels dans n'importe quel ordre. – Praetorian

Répondre

4

Selon cppreference:

Ordre d'évaluation des opérandes de presque tous les opérateurs C++ (y compris l'ordre d'évaluation des arguments de la fonction dans une expression d'appel de fonction et l'ordre d'évaluation des sous-expressions au sein de tout expression) n'est pas spécifié. Le compilateur peut évaluer les opérandes dans n'importe quel ordre et peut en choisir un autre lorsque la même expression est à nouveau évaluée.

Il n'y a pas de bonne ou mauvaise, GCC évalue droit à gauche et à gauche clang à droite