通过编译:
#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 flag)得到的正确输出是:
1. first
2. second
3. third
这种行为有特殊原因吗?
答案 0 :(得分:4)
根据cppreference:
几乎所有C ++运算符的操作数的评估顺序(包括函数调用表达式中函数参数的评估顺序以及任何表达式中子表达式的评估顺序)都未指定。编译器可以按任何顺序计算操作数,并且可以在再次计算同一表达式时选择另一个顺序。
这里没有对错,海湾合作委员会评估从右到左,从左到右进行铿锵