2011-01-18 39 views
12

Mục 12.2.5 trong C++ 03 cho biết "Giới hạn tạm thời đối với thành viên tham chiếu trong bộ khởi tạo của hàm khởi tạo '(12.6.2) "
Vì vậy, tôi đã cố gắng sau chương trìnhRàng buộc tạm thời để tham chiếu const trong danh sách khởi tạo c'tor

#include<iostream> 
using namespace std; 

struct foo 
{ 
    foo() 
    { 
    cout<<"foo c'tor"<<endl; 
    } 
    ~foo() 
    { 
    cout<<"foo d'tor"<<endl; 
    } 
}; 

struct bar 
{ 
    const foo &ref; 
    bar():ref(foo()) 
    { 
    cout<<"bar c'tor"<<endl; 
    } 

}; 

int main() 
{ 
    bar obj; 
}  

Kết quả tôi nhận được là:

foo c'tor 
foo d'tor 
bar c'tor 

Bây giờ theo tiêu chuẩn, tạm thời được tạo ra bởi foo() trong c'tor ini t-danh sách các c'tor của thanh sẽ bị phá hủy sau khi c'tor của thanh như vậy foo d'tor nên được in sau bar c'tor
nhưng nó là cách khác xung quanh.
Vui lòng giải thích lý do.

+1

Điều gì sẽ xảy ra nếu bạn tham chiếu 'ref' bên trong hàm tạo? Có lẽ trình biên dịch quyết định rằng vì nó không thực sự được sử dụng nên nó có thể phá hủy nó trước đó. –

+2

VS2008 tạo ra đầu ra 'foo, bar, foo' khi gcc 4.3.4 tạo ra đầu ra' foo, foo, bar'. Thú vị ... – Naveen

+12

g ++ lỗi, báo cáo. –

Trả lời

3

Tôi đã thử điều này với MS VS 2010, và nó mang lại cho tôi kết quả cũng cho cảnh báo trong biên dịch:

C4413 cảnh báo: 'bar :: ref': thành viên tham chiếu được khởi tạo một tạm thời mà doesn' t tồn tại sau khi các nhà xây dựng thoát

foo c'tor 
bar c'tor 
foo d'tor 
Press any key to continue . . . 

dường như MS VS 2010 thực hiện đặc điểm kỹ thuật một cách chính xác. Tôi đồng ý rằng đó là một lỗi cho g ++.

EDIT: ref phải được khởi tạo trong danh sách khởi tạo của hàm dựng.

Các vấn đề liên quan