2012-01-14 2 views
2

내가 부스트 피닉스를위한 초보자 해요, 제가 코드의 작은 조각을 썼다하지만 완전히 실행 순서에 대해 나를 혼란, 당신은 첫 번째 출력은 "AB" 있지만 코드phoenix :: lambda 함수의 실행 순서는 무엇입니까?

std::vector<int> v; 
v.push_back(1); 
ph::for_each(v, 
      ph::lambda[ph::ref(cout)<<"a", 
         ph::ref(cout)<<"b" 
       ])(v); 


ph::for_each(arg1, 
      ph::lambda[ph::ref(cout)<<"a", 
         ph::for_each(v, 
             ph::lambda[ph::ref(cout)<<"b", 
                ph::ref(cout)<<"c" 
              ]), 
         ph::ref(cout)<<"d" 
       ])(v); 

을 확인할 수 있습니다 두 번째 출력은 "dbca"

실수를 했습니까?

답변

0

문제는 두 번째 ph :: for_each입니다. 내 버전 for_each로 바꾸면 왼쪽에서 오른쪽으로 작동합니다. 제 자신의 버전을 공식 버전과 비교합니다. 차이점은 사용하는 디테일 :: begin과 detail :: end입니다. 하지만 실제 문제는 무엇입니까, 나는 계속 더 조사 할 것입니다.

+0

아니요, 실수를했습니다. 차이점은 반환 유형입니다. 공식적인 것은 반환 F이며, 내 자신은 무효입니다. 아마도 이것이 문제입니다. –

0

일반 함수 인수가 평가되는의 정의되지 않은 순서 아래에서 설명 할 수 있다고 생각합니다. phoenix 람다 구문은 아마도 어떤 형태의 함수 호출로 축소 될 것입니다.

표준에는이 순서가 언급되어 있지 않으므로 컴파일러 구현자는 원하는대로 자유롭게 수행 할 수 있습니다. 함수 인수 평가 순서에 의존 할 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. 람다의 코드는 정의되지 않은 순서로 실행된다는 것을 의미합니다. 이음새는 하나의 람다 함수에 한 줄만 쓰는 것이 좋습니다. 그러나 phoenix 온라인 문서에 따르면 하나의 람다 함수에 둘 이상의 행을 쓸 수 있습니다. 순서가 정의되지 않은 경우 둘 이상의 행을 쓸 때 거의 쓸모가 없다고 생각합니다. 하지만 if_ then_statement는 무엇입니까?이 문장의 순서는 무엇인가요? 나중에 시도해 보겠습니다. 감사 –

관련 문제