람다를 사용하여 가변 키워드로 전역 변수에 대한 참조를 캡처 한 다음 람다 함수의 값을 수정하면 컴파일러마다 결과가 다릅니다.
#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 (태그 / RELEASE_380 / 최종)) :
100 223 223
왜 이런 일이 발생합니까? 이것이 C ++ 표준에서 허용됩니까?