ラムダを使用して、可変キーワードでグローバル変数への参照をキャプチャし、ラムダ関数の値を変更すると、コンパイラによって結果が異なることがわかりました。
#include <stdio.h>
#include <functional>
int n = 100;
std::function<int()> f()
{
int &m = n;
return [m] () mutable -> int {
m += 123;
return m;
};
}
int main()
{
int x = n;
int y = f()();
int z = n;
printf("%d %d %d\n", x, y, z);
return 0;
}
VS 2015およびGCCからの結果(g ++(Ubuntu 5.4.0-6ubuntu1〜16.04.12)5.4.0 20160609):
100 223 100
clang ++からの結果(clangバージョン3.8.0-2ubuntu4(tags / RELEASE_380 / final)):
100 223 223
なぜこれが起こるのですか?これはC ++標準で許可されていますか?