C++ lambda的错误gcc行为

C++ lambda的错误gcc行为,c++,c++11,gcc,lambda,C++,C++11,Gcc,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'; };

通过编辑以下内容:

#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 (". ");
}
而clang(3.8,c++11标志)得到的正确输出是:

1. first
2. second
3. third
这种行为有特殊原因吗?

根据:

几乎所有C++操作符的操作数的顺序(包括函数调用表达式中函数参数的顺序和在任何表达式中的子表达式的求值顺序)未指定。编译器可以按任意顺序计算操作数,并且可以在再次计算同一表达式时选择另一个顺序


这里没有对错之分,GCC从右到左求值,clangleft到right

子表达式的求值顺序未指定,这意味着您的编译器可以选择以任何顺序执行这些
makeItem
调用。
1. first
2. second
3. third