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?
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