2012-02-15 76 views
5

Để ngăn chặn sự tranh luận đang diễn ra trong các ý kiến ​​của an answer I gave recently, tôi muốn một số câu trả lời mang tính xây dựng cho các câu hỏi sau:Thời gian tồn tại của một tài liệu tham khảo liên quan đến mục tiêu của mình với

  1. là cuộc đời của một tài liệu tham khảo khác biệt từ đối tượng nó đề cập đến? Là một tham chiếu chỉ đơn giản là một bí danh cho mục tiêu của nó?
  2. Tham chiếu có thể vượt quá mục tiêu của nó trong một chương trình được định dạng tốt mà không dẫn đến hành vi không xác định không?
  3. Có thể tham chiếu để tham chiếu đến một đối tượng mới nếu bộ nhớ được cấp phát cho đối tượng ban đầu được sử dụng lại không?
  4. Mã sau có chứng minh các điểm nêu trên mà không cần gọi hành vi không xác định không?

Ví dụ mã của Ben Voigt và đơn giản (chạy nó trên ideone.com):

#include <iostream> 
#include <new> 

struct something 
{ 
    int i; 
}; 

int main(void) 
{ 
    char buffer[sizeof (something) + 40]; 
    something* p = new (buffer) something; 
    p->i = 11; 
    int& outlives = p->i; 
    std::cout << outlives << "\n"; 
    p->~something(); // p->i dies with its parent object 
    new (p) char[40]; // memory is reused, lifetime of *p (and p->i) is so done 
    new (&outlives) int(13); 
    std::cout << outlives << "\n"; // but reference is still alive and well 
            // and useful, because strict aliasing was respected 
} 
+0

Đây là toàn bộ câu hỏi, mỗi câu hỏi đòi hỏi phải có một số trích dẫn từ ngữ chuẩn để trả lời đúng (được đưa ra bản chất của câu hỏi tôi nghĩ rằng bạn mong đợi các trích dẫn chuẩn là câu trả lời đúng). Nó/có thể/có ích hơn nếu chúng ta nên tập trung vào một trong số họ, và nếu hữu ích trong bối cảnh đó chỉ trả lời những người khác ... – PlasmaHH

+0

Tôi đồng ý. Xin vui lòng, một câu hỏi cho mỗi câu hỏi. Và bạn sẽ thấy rằng các câu hỏi con đã được trả lời trước đó. –

+0

Ngoài ra, mẫu mã đó có quá nhiều hoạt động. Thực hiện một testcase nhỏ. –

Trả lời

9

Tuổi thọ của tham chiếu có khác biệt với đối tượng được đề cập không? Là một tham chiếu chỉ đơn giản là một bí danh cho mục tiêu của nó?

Một tài liệu tham khảo có đời riêng của mình:

int x = 0; 
{ 
    int& r = x; 
}  // r dies now 
x = 5; // x is still alive 

Một ref-to- const bổ sung có thể kéo dài tuổi thọ của trọng tài của nó:

int foo() { return 0; } 
const int& r = foo(); // note, this is *not* a reference to a local variable 
cout << r;    // valid; the lifetime of the result of foo() is extended 

mặc dù điều này không phải là không cẩn thận:

Tham chiếu đến const chỉ kéo dài tuổi thọ o f một đối tượng tạm thời nếu tham chiếu là a) local và b) liên kết với một giá trị mà giá trị của nó tạo ra đối tượng tạm thời. (Vì vậy, nó không làm việc cho các thành viên, hoặc tài liệu tham khảo địa phương mà được ràng buộc để xvalues.) Ngoài ra, non-const rvalue tài liệu tham khảo kéo dài tuổi thọ trong cùng một thời trang chính xác. [@FredOverflow]


một tài liệu tham khảo có thể sống lâu hơn mục tiêu của mình trong một chương trình cũng như hình thành mà không dẫn đến hành vi undefined?

Chắc chắn, miễn là bạn không sử dụng.


một tài liệu tham khảo có thể được thực hiện để đề cập đến một đối tượng mới nếu việc lưu trữ phân bổ cho các đối tượng gốc được tái sử dụng?

Vâng, theo một số điều kiện:

[C++11: 3.8/7]: Nếu sau thời gian tồn tại của một đối tượng đã kết thúc và trước khi lưu trữ mà các đối tượng chiếm được tái sử dụng hoặc phát hành, một đối tượng mới được tạo ra ở các lưu trữ vị trí mà đối tượng gốc chiếm đóng, một con trỏ trỏ đến đối tượng ban đầu, một tham chiếu được gọi đến đối tượng ban đầu, hoặc tên của đối tượng gốc sẽ tự động tham chiếu đến đối tượng mới và, khi vòng đời của đối tượng mới có đã bắt đầu, có thể được sử dụng để thao tác đối tượng mới, nếu:

  • việc lưu trữ cho các đối tượng mới chính xác chồng lên vị trí lưu trữ mà các đối tượng ban đầu chiếm đóng, và
  • đối tượng mới là loại giống như đối tượng gốc (bỏ qua các cấp cao nhất cv-vòng loại), và
  • loại đối tượng gốc không đủ điều kiện và nếu loại lớp không chứa bất kỳ thành viên dữ liệu không tĩnh nào có loại đủ điều kiện hoặc loại tham chiếu và
  • đối tượng ban đầu là đối tượng xuất phát nhiều nhất (1.8) của kiểu T và đối tượng mới là một đối tượng có nguồn gốc lớn nhất của kiểu T (có nghĩa là chúng không phải là các lớp con lớp cơ sở).

Có đoạn mã sau chứng minh các điểm trên mà không gọi hành vi undefined?

Tl; dr.

+0

Một tham chiếu đến const chỉ kéo dài tuổi thọ của một đối tượng tạm thời nếu tham chiếu là a) local và b) liên kết với một giá trị mà giá trị của nó tạo ra đối tượng tạm thời. (Vì vậy, nó không làm việc cho các thành viên, hoặc tài liệu tham khảo địa phương mà được ràng buộc để xvalues.) Ngoài ra, non-const rvalue tài liệu tham khảo kéo dài tuổi thọ trong cùng một thời trang chính xác. – fredoverflow

+0

@FredOverflow: Ta! –

5
  1. Yes. Ví dụ: các tham chiếu không liên quan cục bộ có thời lượng lưu trữ tự động và thời gian liif tương ứng và có thể tham chiếu đến các đối tượng có thời lượng lâu hơn.

  2. Có, tham chiếu lơ lửng là một ví dụ. Miễn là các tài liệu tham khảo đó không được sử dụng trong bất kỳ biểu thức nào khi chúng trở nên lúng túng, chúng vẫn ổn.

  3. Có quy tắc đặc biệt trong khoản 3 về trường hợp này. Tên của đối tượng, con trỏ và tham chiếu tự động tham chiếu đến đối tượng mới sử dụng lại lưu trữ trong các điều kiện bị hạn chế. Tôi tin rằng đó là vào cuối 3.8. Một người có thông số kỹ thuật tiện dụng, vui lòng điền vào đúng ref ở đây.