2011-03-28 20 views
10

thể trùng lặp:
C++: Life span of temporary arguments?ranh giới đầy đủ biểu hiện và tuổi thọ của temporaries

Người ta nói rằng các biến tạm thời bị phá hủy như là bước cuối cùng trong việc đánh giá đầy đủ thể hiện, ví dụ

bar(foo().c_str()); 

con trỏ tạm thời sống cho đến khi trở lại quầy bar, nhưng những gì cho

baz(bar(foo().c_str())); 

là nó vẫn còn sống cho đến khi trở lại quầy bar, hoặc baz trở lại có nghĩa là diệt hết thể hiện ở đây, trình biên dịch tôi đã kiểm tra đối tượng hủy sau baz trả về, nhưng tôi có thể dựa vào đó không?

+0

có, câu trả lời cho câu hỏi này phải là một phần của http://stackoverflow.com/questions/4214153/lifetime-of-temporaries, tôi đã hỏi một câu hỏi mới vì tôi không có quyền đăng nhận xét ở đó và tôi đã quan tâm đến một chi tiết cụ thể không được đề cập ở đó. – Vasaka

Trả lời

10

Cuộc sống tạm thời cho đến khi kết thúc biểu thức đầy đủ mà chúng được tạo ra. "Biểu thức đầy đủ" là một biểu thức không phải là biểu thức con của biểu thức khác.

Trong baz(bar(...));, bar(...) là biểu thức con của baz(...), trong khi baz(...) không phải là biểu hiện phụ của bất kỳ thứ gì. Do đó, baz(...) là biểu thức đầy đủ và tất cả các thời gian được tạo trong quá trình đánh giá biểu thức này sẽ không bị xóa cho đến khi sau khi trả về baz(...).

+2

Lưu ý, mặc dù, rằng các nhà xây dựng là một trường hợp đặc biệt (tôi nghĩ - 90% chắc chắn), để trong 'baz (X (foo(). C_str()));', trong đó 'X' là một lớp và đối số 'b'' là một lời gọi đến hàm tạo của' X', thời gian tồn tại của 'c_string' sẽ kết thúc khi khởi tạo của hàm khởi tạo. –

3

Như tên cho thấy, biểu thức đầy đủ là tất cả các biểu thức, bao gồm cả cuộc gọi đến baz() và do đó tạm thời sẽ tồn tại cho đến khi cuộc gọi đến số baz() trả về.