使用 lambda 的错误 gcc 行为
Wrong gcc behaviour with 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 (". ");
}
使用 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从右到左评估,从左到右叮当
相关文章:
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 带有 gcc 和 clang 的可变参数宏扩展的奇怪行为
- 在MSVC和GCC上使用VSNPRINTF时不同的行为
- 未定义的行为或 gcc 优化错误
- 不同的内在行为取决于 GCC 版本
- MSVC 和 GCC 之间的矢量行为不同
- 依赖GCC/LLVM的"-fexceptions"在技术上是未定义的行为吗?
- 对于具有绝对路径的库的GCC行为是什么?
- const成员初始化之前的用法是GCC和Clang的这种预期行为
- 使用 lambda 的错误 gcc 行为
- GCC 和 Clang 在 constexpr 构造函数上的不同行为
- 无法解释的 VIM 或 GCC 行为
- 在哪里查找 GCC 实现定义行为的实现?
- __has_trivial_copy在clang和gcc中的行为不同.谁'是吗
- gcc-O2的奇怪整数行为
- gcc 4.7.0中std::vector::resize()的奇怪行为
- 混合使用C和C++代码会在GCC中产生意想不到的行为
- GCC和clang(SFINAE)之间的过载解决行为差异
- 不同的 constexpr 行为 vs2015u2 与 gcc
- __attribute((const))的gcc行为不一致