【发布时间】: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调用。