값으로 C ++ 0x 람다 캡처 항상 const?


102

값으로 캡처하고 캡처 된 값을 상수가 아닌 값으로 만드는 방법이 있습니까? 상수가 아니지만 그래야하는 메서드를 캡처 및 호출하고 싶은 라이브러리 펑터가 있습니다.

다음은 컴파일되지 않지만 foo :: operator () const로 수정합니다.

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}

답변:


165

mutable을 사용하십시오.


auto bar = [=] () mutable -> bool ....

mutable이 없으면 람다 개체 const의 연산자 ()를 선언합니다.


-5

mutable 을 사용하는 다른 방법이 있습니다 (Crazy Eddie가 제안한 솔루션).

[=]를 사용하면 블록이 모든 객체를 값으로 캡처합니다. [&] 를 사용하여 모든 개체를 참조로 캡처 할 수 있습니다 .

auto bar = [&] () -> bool

또는 참조로 특정 객체 [=, & afoo] 만 캡처 할 수 있습니다 .

auto bar = [=, &afoo] () -> bool

자세한 내용은이 페이지를 참조하십시오 ( 설명 섹션) : http://en.cppreference.com/w/cpp/language/lambda


11
이것은 완전히 다른 일을합니다. 상호 교환 할 수 없습니다. 이것은 OP의 질문에 응답하지 않습니다.
Edward Strange

1
이 솔루션의 문제는 람다가 실행되기 전에 파괴 된 캡처 된 로컬 변수에 대해 작동하지 않는다는 것입니다 (예 : 분리 된 std :: thread를 시작할 때).
사이먼 Ninon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.