使用 lambda 的错误 gcc 行为

Wrong gcc behaviour with lambda

本文关键字:gcc 行为 错误 lambda 使用      更新时间:2023-10-16

通过编译这个:

#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 (". ");
}

使用 GCC(5.4.0,C++11 标志),输出如下:

3. first
2. second
1. third

而 clang(3.8,C++11 标志)得到的正确输出是:

1. first
2. second
3. third

这种行为是否有特殊原因?

根据 cpp 偏好:

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

这里没有对错之分,GCC从右到左评估,从左到右叮当