2013-09-16 62 views
7

gì là vụ xảy ra trong trường hợp sau đây:Đi qua giá trị trả về của một hàm như tài liệu tham khảo

int functionA() { 
    return 25; 
} 

void functionB(const int& ref) { 
    cout << ref << endl; 
} 

void start() { 
    functionB(functionA()); 
} 

Khi biên dịch ví dụ này, nó sẽ tạo ra giá trị đúng 25. Làm thế nào để làm việc này? Không nên trả về giá trị trả về tham chiếu trên ngăn xếp (xóa khỏi ngăn xếp) khi chỉ sử dụng một tham chiếu đến nó, hoặc là hành vi không xác định?

+1

xem tiêu chuẩn C++ 11 12.2/4.5 về ảnh hưởng của tham chiếu liên tục đối tượng tạm thời – nijansen

Trả lời

8

Điều này "hoạt động" vì const int& ref - khi tham chiếu là const (đảm bảo rằng bạn không muốn thay đổi), trình biên dịch sẽ tạo đối tượng tạm thời trong mã gọi (start trong trường hợp của bạn), sau đó chuyển tham chiếu đến đó.

Nếu bạn xóa const nó sẽ không biên dịch được vì kết quả của functionA không thể được chuyển thành tham chiếu.

8

Không có "giá trị trả về trên stack" (chứ chưa nói đến một "ngăn xếp"): functionA trả về một intbởi giá trị, vì vậy biểu thức functionA() chỉ đơn giản là một giá trị tạm thời loại int. Giá trị này liên kết với tham chiếu không đổi trong functionB và do tuổi thọ của nó là biểu thức đầy đủ, mọi thứ đều ổn.