1
VS2013을 사용하고 있는데 람다가 포함 된 클래스의 인스턴스를 여러 개 사용할 때 이상한 동작이 발생하고 정적 변수가 포함 된 람다를 발견했습니다. 정적 변수는 공유 된 것처럼 보입니다.C++ lambdas 및 정적 변수의 예상 동작
예제 코드는 매우 아래로 손질 여전히 본질을 캡처 :
class HasLambda
{
public:
typedef const char* (*ToCharPtr) (const int&);
void Init(ToCharPtr pfnToCharPtr) {
m_pfnCharPtrConverter = pfnToCharPtr;
}
const char* IntToString(int i) {
return m_pfnCharPtrConverter(i);
}
static HasLambda* Make() {
HasLambda* pHasLambda = new HasLambda;
pHasLambda->Init([] (const int &i) -> const char* { static char buf[ 33 ]; sprintf(buf, "%d", i); return buf; });
return pHasLambda;
}
protected:
ToCharPtr m_pfnCharPtrConverter;
};
int _tmain(int argc, _TCHAR* argv[])
{
HasLambda* a;
a = HasLambda::Make();
HasLambda* b;
b = HasLambda::Make();
const char* aValue = a->IntToString(7);
printf("a: %s\n", aValue);
const char* bValue = b->IntToString(42);
printf("b: %s\n", bValue);
printf("a: %s\n", aValue);
return 0;
}
내가 얻을 출력은이 : 값이 동일하게 : 나는 두 번째 A가 예상 한 것
a: 7
b: 42
a: 42
첫 번째로. 내가 컴파일러 버그를보고, 또는 내가 람다와 정적 변수가 작동하는 방식을 오해하고 있습니까? 어떤 방식 으로든 람다를 잘못 사용하고 있습니까?
나는 당신이 말하는 것을 얻습니다. – Rodyland
은'SomeLambda'는'HasLambda'의 내부 클래스입니까? 그렇다면 사적인 것 같습니까? –
sfk92fksdf @ Lambdas는 기본적으로 이름이 지정되지 않습니다. 유형을 명명하는 방법은 없으므로 자동 변수 나 객체와 같은 함수를 저장하는 std :: function과 같은 것을 할당하는 것 외에도 많은 작업을 수행 할 수 없습니다. – Charlie