Để 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
- 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ó?
- 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?
- 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?
- 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
}
Đâ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
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 đó. –
Ngoài ra, mẫu mã đó có quá nhiều hoạt động. Thực hiện một testcase nhỏ. –