과부하 기준 함수 :C++ nonconst const가 다음 코드에서
int foo(const int& f) //version 1
{
int g = f;
return int(foo(g)); // calls itself, turning into SO
}
int& foo(int& f) //version 2
{
f *= -1;
return f;
}
int main()
{
int f = 11;
cout << foo(f) << endl;
cout << foo(22) << endl;
}
제 COUT 인쇄 -11 예상; f는 lvalue이므로 foo의 두 번째 버전에 바인딩됩니다 (단, 첫 번째 버전에도 바인딩 할 수 있지만 두 번째 버전은 더 일치합니다).
foo
의 두 번째 호출은 매개 변수로 rvalue를 사용하므로 foo
의 유일한 실행 가능 버전이 첫 번째 호출입니다. 여태까지는 그런대로 잘됐다. foo
의 첫 번째 버전에서는 두 번째 버전 (왼쪽 값)을 호출하고 foo
의 두 번째 버전을 호출 한 후 복사본을 반환 할 수 있도록 매개 변수 복사본을 만들었습니다. 이것은 스택 오버플로가 될 것입니다. 여전히 foo
의 첫 번째 버전이 호출됩니다.
누군가가 왜 이런 일이 발생했는지 설명해 주시겠습니까? 첫 번째 버전 foo
내의 g
은 매개 변수로 전달 될 때 foo
의 두 번째 버전에 바인딩 될 것으로 예상됩니다.
첫 번째'foo'는 두 번째'foo'에 대해 어떻게 알 수 있습니까? –