2011-02-09 2 views
45

:lambdas는 정적 멤버 함수를 호출하기 위해 'this'를 캡처해야합니까? 다음 코드

struct B 
{ 
    void g() 
    { 
     []() { B::f(); }(); 
    } 

    static void f(); 
}; 

g ++ 4.6 오류 준다 :

test.cpp: In lambda function:
test.cpp:44:21: error: 'this' was not captured for this lambda function

는 (흥미롭게도, 4.5 g ++ 코드를 컴파일 미세 참조).

이것은 g ++ 4.6의 버그입니까? 아니면 정적 멤버 함수를 호출 할 수 있도록 'this'매개 변수를 캡처해야합니까? 나는 그것이어야하는 이유를 모르겠다. 나는 심지어 B::으로 전화를 걸었다.

+17

이는 버그 일 수 있습니다. –

+2

GCC 4.7.2의 여전히 버그. 'this'를 캡처로 추가하면 여전히 작동합니다. –

+1

GCC 4.8에서 수정되었습니다. – akim

답변

32

동의합니다. 정상적으로 컴파일해야합니다. 수정을 위해 (이미 알지 못했다면) 참조 캡처를 추가하면 gcc에서 정상적으로 컴파일됩니다. 4.6

struct B 
{ 
    void g() 
    { 
     [&]() { B::f(); }(); 
    } 

    static void f() { std::cout << "Hello World" << std::endl; }; 
}; 
+27

그들은 람다를 더 못생긴 만들 수 있었 을까? 대답 하지마. 적어도 우리는 그것들을 가지고있다. – wheaties

+32

@wheaties 나는 어떻게 든 <>'에서 일할 수 없다는 것에 실망했다. 대괄호 세트를 찾으려면 ... – KitsuneYMG

+20

@KitsuneYMG : http://msdn.microsoft.com/en-us/library/dd293599.aspx에 예제가 있습니다. auto g = [] (int x) -> function {return [=] (int y) {return x + y; }; }; – TonyK

관련 문제