2013-05-02 24 views

Trả lời

26

Tôi không chắc chắn 100% về điều này, nhưng điều này có thể là để ngăn chặn sự mơ hồ về cú pháp. Ví dụ: hãy xem xét các lớp sau:

class BadTimes { 
    struct Overloaded; 
    int Overloaded;   // Legal, but a very strange idea. 

    int confusing(Overloaded); // <-- This line 
}; 

Dòng được chỉ định có nghĩa là gì? Như được viết, đây là khai báo hàm thành viên có tên là confusing chấp nhận tham số là đối tượng thuộc loại Overloaded (tên không được chỉ định trong khai báo hàm) và trả về một int. Nếu C++ 11 cho phép initializers sử dụng dấu ngoặc đơn, điều này sẽ không rõ ràng, vì nó cũng có thể là định nghĩa của một thành viên thuộc loại int có tên confusing được khởi tạo với giá trị của thành viên dữ liệu Overloaded. (. Điều này liên quan đến vấn đề hiện tại với Most Vexing Parse)

Bằng cách yêu cầu dấu ngoặc nhọn, sự mơ hồ này được lấy ra:

class BadTimes { 
    struct Overloaded; 
    int Overloaded;   // Legal, but a very strange idea. 

    int confusing{Overloaded}; // <-- This line 
}; 

Bây giờ, thì rõ ràng rằng confusing thực sự là một int khởi tạo với giá trị của Overloaded , bởi vì không có cách nào để đọc nó như là một khai báo hàm.

Hy vọng điều này sẽ hữu ích!

+1

bạn có thể giải thích chi tiết tại sao 'nhầm lẫn' là định nghĩa và không khai báo? ** "đây là định nghĩa của hàm thành viên có tên gây nhầm lẫn mà chấp nhận như một tham số một đối tượng kiểu bị quá tải" **. tôi có sự nhầm lẫn này bởi vì nó phải là mơ hồ đúng không? –

+1

@ Koushik- Bạn nói đúng, điều đó nên được khai báo, chứ không phải định nghĩa. Hãy để tôi sửa chữa ... – templatetypedef