2013-06-28 34 views
6

Phần 12.2.5 của tiêu chuẩn nói:đời tạm thời mở rộng

Một tạm thời bị ràng buộc vào một tham số tham chiếu trong một cuộc gọi chức năng (5.2.2) vẫn tồn tại cho đến khi hoàn thành sự biểu hiện đầy đủ chứa cuộc gọi . Một ràng buộc tạm thời với giá trị trả về trong một hàm trả về câu lệnh (6.6.3) vẫn tồn tại cho đến khi hàm thoát. Trong tất cả các trường hợp này, các thời gian được tạo trong quá trình đánh giá biểu thức khởi tạo tham chiếu, ngoại trừ tạm thời mà tham chiếu bị ràng buộc, bị hủy ở cuối biểu thức đầy đủ trong chúng được tạo và trong thứ tự đảo ngược của việc hoàn thành công trình xây dựng của họ.

Mã tôi cố gắng tìm hiểu là:

#include <iostream> 

const int& foo(const int& fooRef) 
{ 
    return fooRef; 
}          // #0 

int main (void) 
{ 
    const int& numberRef = foo(5);  // #1 
    std::cout << numberRef;   // #2 
    return 0; 
} 

On line #1 một đối tượng tạm thời được tạo ra và bị ràng buộc để fooRef tham số của foo. fooRef bị hủy trên đường dây #0. Vì vậy, tôi nghĩ tạm thời nên bị phá hủy ở đây vì phần mở rộng suốt đời không phải là chuyển tiếp.

Câu hỏi:

  1. không until the function exits nghĩa là gì? Có nghĩa là untill it finished executing?

  2. Tại sao tôi nhận được kết quả 5. Một đối tượng tạm thời vẫn tồn tại trên dòng #2?

  3. Tôi làm cách nào để diễn giải báo giá chuẩn để tìm ra cách hoạt động của ví dụ này?

Từng bước đi qua nguyên tử với tham chiếu đến tiêu chuẩn sẽ được đánh giá cao. Cảm ơn bạn!

P. S. Câu trả lời được chấp nhận here cũng cho biết mã là broken và tôi không nhận được, tại sao tôi nhận được kết quả như vậy của chương trình.

Trả lời

3

Điều gì sẽ xảy ra cho đến khi thoát khỏi hàm? Nó có nghĩa là cho đến khi nó kết thúc thực hiện?

Có.

Tại sao tôi nhận được 5 đầu ra. Một đối tượng tạm thời vẫn tồn tại trên dòng # 2?

dereferencing một tài liệu tham khảo mà không bị ràng buộc vào một đối tượng sống là không xác định hành vi, vì vậy bạn có thể nhận được 5 cũng như 42 cũng như bất cứ điều gì khác (bao gồm cả một vụ tai nạn). Bạn chỉ đơn giản là không thể có bất kỳ kỳ vọng về một chương trình có hành vi không xác định.

Tôi làm cách nào để diễn giải báo giá chuẩn để tìm ra cách hoạt động của ví dụ này?

Khá giống như bạn đã làm. Tạm thời bị ràng buộc với tham số chức năng fooRef, bị hủy khi trở về từ hàm. Vì tạm thời đó được ràng buộc với giá trị trả về, đối tượng đó chấm dứt tồn tại khi hàm trả về. Sau đó, bạn đang dereferencing một tham khảo lủng lẳng, mang đến cho bạn UB.

1
  1. Nó có nghĩa là cho đến khi cú đúp đóng cửa, ví dụ: }.

  2. Bạn đã gọi UB, bạn có một tham chiếu treo lơ lửng.

Hãy thử sửa đổi mã sau của bạn và xem nội dung được in. Nó có thể sẽ in 6 vì đó là những gì đã được cuối cùng trên ngăn xếp. Hoặc thay vào đó, hãy thử chuyển một số điện thoại std::string, bạn có thể gặp sự cố.

int main (void) 
{ 
    const int& numberRef = foo(5); 
    foo(6); 
    std::cout << numberRef; 
    return 0; 
} 
Các vấn đề liên quan