2013-05-09 2 views
2

boost :: ref의 사용에 대해 혼란스러워합니다.값을 취하는 함수에 대한 참조를 전달하기위한 boost :: ref 사용

void f(int x) 
{ 
    cout << x<<endl; 
    x++; 
} 

int main(int argc, char *argv[]) 
{ 
    int aaa=2; 
    f(boost::ref(aaa)); 
    cout << aaa<<endl; 
    exit(0); 
} 

함수에 심판을 전달의 사용은 무엇입니까 - 나는 어떤 사람이 다음을 수행 할 것입니다 이유를 이해 해달라고. 나는 항상 값으로 대신 전달할 수 있습니다. 또한 ref가 실제로 전달되지는 않습니다. 위의 경우 main의 aaa 값은 2로 유지됩니다.

정확하게 부스트 리퍼런스가 유용합니까?

이 시나리오에서는 boost :: ref를 사용할 수 있습니까? iterator refernce를 std :: sort 함수에 전달하고 싶다. 일반적으로 정렬은 반복자 복사본에서 작동합니다. - : ref가 참조를 위해 작동하도록 만드시겠습니까? (std :: sort의 변경없이)

답변

11

나는 어떤 사람이 그렇지 않은 것

다음을 수행 할 것입니다 이유를 이해 해달라고. 그것은 boost::ref (또는 요즘은 std::ref)이 아닙니다. 함수가 값에 의해 인수를 취하면 함수가 참조로 가져 오도록 강요 할 방법이 없습니다.

정확하게 부스트 리퍼런스가 유용합니까?

template <typename T> 
void f(T x) {++x;} 

f(aaa);  cout << aaa << endl; // increments a copy: prints 0 
f(ref(aaa)); cout << aaa << endl; // increments "a" itself: prints 1 
:

는 그것이 기준에 대한 템플릿을 인스턴스화 참고로 인수 걸리면로서의 기능을 템플릿 행동을하는데 사용될 수

(랩퍼)보다 값 형 입력

일반적인 특정 사용 함수에 인수를 바인딩입니다 :

void f(int & x) {++x;} 

int aaa = 0; 
auto byval = bind(f, aaa);  // binds a copy 
auto byref = bind(f, ref(aaa)); // binds a reference 

byval(); cout << aaa << endl; // increments a copy: prints 0 
byref(); cout << aaa << endl; // increments "a" itself: prints 1 

부스트를 사용하는 것이 가능 :; 이 시나리오에서 참조하십시오. iterator refernce를 std :: sort 함수에 전달하고 싶다. 일반적으로 정렬은 반복자 복사본에서 작동합니다. - : ref가 참조를 위해 작동하도록 만드시겠습니까?

아니오; 레퍼런스 래퍼는 반복자 요구 사항을 충족시키지 않으므로 표준 알고리즘에서 사용할 수 없다. 가능하다면 대부분의 알고리즘은 (대부분 sort 구현을 포함하여 많은 사람들이해야하는 것처럼) 반복자의 독립적 인 사본을 만들 필요가 있다면 무섭게 잘못 될 것입니다.

+0

오키는 이해하지만 어떻게 작동하는지 설명 할 수 있습니까? 템플릿 void f (_T x) {x ++; } int main (int argc, char * argv []) {int aaa = 2; f > (boost :: ref (aaa)); cout << aaa <> aaa; 출구 (0); } 인쇄 된 값은 3입니다. x 함수가 참조가 된 방법을 이해하지 못합니까? – Rohit

+0

@ user2161003 :'reference_wrapper' 부분을 명시 적으로 작성하면 (필수는 아닙니다), 자신의 질문에 답했습니다 : 템플릿이 "참조 래퍼"유형 ('ref()'에 의해 반환 됨)으로 인스턴스화됩니다. 이는 랩핑하는 변수에 대한 참조처럼 작용합니다. –

+1

하지만 어떻게? reference_wrapper의 객체에는 ++ 연산자가 없습니다. x ++는 어떻게 작동합니까? – Rohit

-1

documentation을 읽었습니까?

은 말한다 :

심판 라이브러리는 보통 인수의 사본을 것 템플릿 (알고리즘) 기능에 대한 참조를 전달하는 유용한 작은 도서관이다. 첫 번째 예에서

, void f(int) 함수 템플릿이 아니므로 효과가없는 : 익명의 임시 boost::reference_wrapper<int>을 작성하고 바로 다음 함수에 int를 전달하는 역 참조하는 int&로 다시 변환된다. 다행히도 컴파일러는 아무런 효과가 없으므로이 넌센스를 모두 버려두기를 바랍니다.

당신 말 :

... 난 항상 대신 값으로 전달할 수 있습니다.

이는 사실이지만 다른 것들을합니다. 참조로 전달 :

  • 정수에 대한 아마 무의미하지만, 크거나 비용이 드는 복사
  • 객체 유용 사본을 피 호출자를 허용하는 것은 호출 된 함수 가 인수 무엇을했는지 볼 수 있습니다 . 반복자는 일반적으로 cheap- 있지만 (이 std::sort 유용 할 것 같지 않다,하지만 수 있도록 일반적으로 아웃 매개 변수 사본을 피하고, 그것은 std::sort이 반복자 참조에 따라 행동 할 수 있습니다

유용 할 수 있습니다 to-copy 값 유형),하지만 그것을 시도하지 않았습니다. 그게 도움이된다고 생각한다면 왜 시도하고 보지 않으시겠습니까?

관련 문제