2013-03-15 42 views
5

Tôi hiện đang bị nhầm lẫn với câu lệnh sau - Tôi mặc dù tuyên bố này sẽ mang lại một lỗi trong thời gian biên dịch tuy nhiên nó không.Khởi tạo một con trỏ

// statement 1: 
someclass* q(someclass()); 

Tôi hiểu rằng nếu báo cáo kết quả là như thế này

// statement 2: 
someclass* q(&someclass()); 

Tôi muốn biết tại sao Statment 1 doesnt tạo ra một lỗi hoặc thậm chí nếu đó là hợp lệ (là có bất cứ điều gì tôi đang thiếu đằng sau hậu trường ?)

+0

Bạn đã cố sử dụng "con trỏ" trong ví dụ đầu tiên chưa? – molbdnilo

Trả lời

12

Tôi muốn biết tại sao Statment 1 doesnt tạo ra một lỗi hoặc thậm chí nếu đó là hợp lệ

Bản tuyên bố đầu tiên là hợp lệ, mặc dù nó có lẽ sẽ không làm những gì bạn mong đợi: tuyên bố này là tuyên bố một hàm có tên q trả về một con trỏ tới một đối tượng kiểu someclass và nhập vào một hàm mà lần lượt không chấp nhận đối số và trả về một đối tượng kiểu someclass. Đây được gọi là Most Vexing Parse.

Câu lệnh thứ hai không hợp lệ: nó đang cố khai báo một con trỏ có tên q đến một đối tượng kiểu someclass và khởi tạo con trỏ này đến địa chỉ của đối tượng được xây dựng theo biểu thức someclass(). Tuy nhiên, lưu ý rằng someclass()tạm thời và việc sử dụng địa chỉ tạm thời là bất hợp pháp.

+2

Vì lý do này, tôi khuyên bạn nên khởi tạo bằng cách sử dụng toán tử '=' thay cho '()'. ví dụ. 'someclass * q = someclass();' sẽ tạo ra lỗi như bạn mong đợi. – Lorkenpeist

+2

Câu lệnh thứ hai không hợp lệ. Bạn * không thể * lấy địa chỉ tạm thời. –

+0

@ BenjaminLindley: Chết tiệt, làm cách nào tôi có thể bỏ qua điều đó. Cảm ơn bạn –

3

Tuyên bố 1 thực sự là tuyên bố cho một hàm. Hàm này được gọi là q và đưa con trỏ đến hàm không tham số và trả về someclass và trả về con trỏ đến someclass.

Xem Most Vexing Parse.

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