2017-11-06 20 views
4

나는 코드를 포함하는, this answer을 게시 한 :람다 식별자는 어떻게 캡쳐됩니까?

template <typename T> 
auto vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon) { 
    const auto& first = index == 0U ? polygon.back() : polygon[index - 1U]; 
    const auto& second = polygon[index]; 
    const auto& third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U]; 

    return [&](auto& output){ output.push_back(first); 
           output.push_back(second); 
           output.push_back(third); }; 
} 

내가 생각하는 first, secondthird 정말이 같은 람다 식별자로 사용할 수 있습니다 :

[first = index == 0U ? polygon.back() : polygon[index - 1U], 
second = polygon[index], 
third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U]](auto& output){ output.push_back(first); 
                          output.push_back(second); 
                          output.push_back(third); }; 

하지만 난 단지 원하는 일정한 참조로 캡처하기. 식별자에 유형을 지정하지 않으면 어떻게 할 수 있습니까?

+0

람다의 각 인스턴스는 고유 한 이름이없는 클래스의 인스턴스입니다. 당신은 람다 (lambda) 나 그런 것에 식별자 (identifier)를 할당 할 수 없습니다. –

+3

@ Sam. 나는 동의하지 않는다. 람다는 최고급 유형이다. 그리고 이것은 원래의 질문과 아무 관련이 없습니다. –

+0

그래서 const에 대한 값으로 캡처하는 것을 피하기 위해 const 참조를 캡처하는 방법은 무엇입니까? BTW, 결국 코드 조각은 끔찍하게 읽을 수 없습니다. 이럴 경우 가치가 있다고 생각하지 않습니다. – StoryTeller

답변

4

수 없습니다. 람다 캡쳐리스트에 cv-qualifier를 넣을 곳이 없다. 당신은 relevant grammar 살펴 가질 수 있습니다

init-capture: 
    identifier initializer 
    & identifier initializer 

당신은 또한 캡처 목록에서 유형을 지정할 수 없습니다 (위의 문법 참조).

[&first = index == 0U ? polygon.back() : polygon[index - 1U], 
&second = polygon[index], 
&third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U]](auto& output){ output.push_back(first); 
                          output.push_back(second); 
                          output.push_back(third); }; 

또는 너무 IMO 방법이 더 읽을 수있는 첫 번째 조각, 스틱 :

당신이 그러나 할 수있는 것은 이름 앞에 &을 넣어 const가 아닌 참조에 의해 캡처입니다. 당신이 캡처 목록에서 참조를 캡처하는 경우 secondthird 실제로 const을하게 될 경우, first, 그렇게

1polygon


const입니다! 그러나 그것이 아니라면, 위에 언급 된 이유로

+2

벡터 참조 다각형 자체가 const이기 때문에 참조는 const입니다. –

+0

@ MichaëlRoy 사실입니다.이 점을 발견 한 +1 : 감사합니다. – Rakete1111

+0

'polygon'이 const가 아닌 경우 ['std :: as_const'] (http://en.cppreference.com/w/cpp)를 사용할 수 있습니다./유틸리티/as_const). – Oktalist