【问题标题】:Wrong gcc behaviour with lambdalambda 错误的 gcc 行为
【发布时间】:2018-03-21 03:52:47
【问题描述】:

通过编译:

#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 flag) 的输出是这样的:

3. first
2. second
1. third

而 clang (3.8, c++11 flag) 得到的正确输出是:

1. first
2. second
3. third

这种行为有什么特殊原因吗?

【问题讨论】:

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

标签: c++ c++11 gcc lambda


【解决方案1】:

根据cppreference

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

这里没有对错,GCC从右到左求值,clang从左到右

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 2018-03-22
    • 2015-03-31
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多