Trong đoạn mã sau:C++ nonconst const chức năng tham khảo quá tải
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;
}
Các bản in cout đầu tiên -11 như mong đợi; f là lvalue, vì vậy nó liên kết với phiên bản thứ hai của foo (mặc dù nó có thể liên kết với phiên bản thứ nhất, phiên bản thứ 2 đó là kết hợp tốt hơn).
Cuộc gọi thứ hai là foo
đang sử dụng giá trị làm tham số, do đó, phiên bản duy nhất khả thi của foo
là phiên bản đầu tiên. Càng xa càng tốt. Bên trong phiên bản đầu tiên của foo
, tôi đã tạo một bản sao của thông số để tôi có thể gọi phiên bản thứ hai (với số lvalue) và trả lại một bản sao sau khi cuộc gọi của phiên bản thứ hai là foo
. Điều này sẽ biến thành tràn ngăn xếp; vẫn là phiên bản đầu tiên của foo
sẽ được gọi.
Có thể ai đó vui lòng giải thích cho tôi biết tại sao điều này xảy ra? Tôi mong đợi rằng g
bên trong phiên bản đầu tiên của foo
để liên kết với phiên bản thứ hai của foo
khi được chuyển làm tham số.
Làm thế nào để 'foo' đầu tiên biết về' foo' thứ hai? –