Được tạo tạm thời như là một phần của một đối số cho một cuộc gọi hàm được bảo đảm ở lại cho đến khi hàm được gọi kết thúc, ngay cả khi tạm thời không được chuyển trực tiếp đến hàm?Khi nào các thời gian được tạo ra như một phần của một cuộc gọi chức năng bị hủy?
Có hầu như không có cơ hội đó là chặt chẽ, vì vậy đây là một ví dụ:
class A {
public:
A(int x) : x(x) {printf("Constructed A(%d)\n", x);}
~A() {printf("Destroyed A\n");}
int x;
int* y() {return &x;}
};
void foo(int* bar) {
printf("foo(): %d\n", *bar);
}
int main(int argc, char** argv) {
foo(A(4).y());
}
Nếu A(4)
được chuyển trực tiếp đến foo
nó chắc chắn sẽ không bị hủy diệt cho đến sau khi cuộc gọi foo
kết thúc, nhưng thay vào đó tôi đang gọi một phương pháp tạm thời và mất mọi tham chiếu đến nó. Tôi theo bản năng nghĩ rằng tạm thời A
sẽ bị phá hủy trước khi foo
thậm chí bắt đầu, nhưng thử nghiệm với GCC 4.3.4 cho thấy nó không phải là; đầu ra là:
Xây dựng A (4)
foo(): 4
Destroyed Một
Câu hỏi đặt ra là, được hành vi của GCC được bảo đảm bởi spec? Hoặc là một trình biên dịch được phép hủy bỏ tạm thời A
trước khi gọi tới số foo
, đánh dấu con trỏ đến thành viên mà tôi đang sử dụng?
tạo ảnh vui nhộn Nhờ bạn và Jerry cho việc tìm kiếm các tài liệu tham khảo trong spec, tôi đã khó khăn khi tìm nó –