2013-06-11 34 views
9

Trong C++ 11 chúng ta có cú pháp khởi tạo đồng nhất tốt đẹp cho các đối tượng. Tại sao nó không mở rộng để khởi tạo các kiểu không đối tượng?Tại sao cú pháp khởi tạo đồng bộ chỉ được áp dụng cho các đối tượng?

Có bất kỳ sự mơ hồ nào về cú pháp đó hay chỉ là một số câu hỏi ngu ngốc mà tôi đang hỏi?

Ví dụ:

struct s{ int k;}; 
s s1{1}; //ok (object initialization) 
s const& s3{3}; //ok (object initialization) 
s& s2{s1}; //error (reference initialization) 

Một ví dụ hữu ích hơn:

struct t{ t(t const& x) : k(x.k){} int k;}; 
struct c 
{ 
    c(t& x1,t& x2) 
    : s1_{x1} //error (reference initialization) 
    , s2_{x2} //ok (object initialization) 
    {} 
t& s1_; 
t s2_; 
}; 

Một số khác:

template<class T> 
T get() 
{ 
    return T{}; 
} 

//ok (object initialization) 
get<int>(); 
//error (void initialization? I do not know terminology for void() token equivalent) 
get<void>(); 
+0

Tôi đoán là các nhà thiết kế ngôn ngữ đã quyết định rằng cú pháp 's1_ (x1)' hiện tại là khá đủ. – dasblinkenlight

+0

@ dasblinkenlight rõ ràng là không (xem xét MVP). –

+0

Ví dụ cuối cùng của bạn là bất hợp pháp. 'void' là một kiểu đối tượng không đầy đủ; không có cách nào để tạo các đối tượng kiểu 'void'. – Angew

Trả lời

0

Các quy tắc khởi tạo của C++ là khá phức tạp. Chúng được mô tả trong nửa sau của chương (điều 8) của tiêu chuẩn. Có khởi tạo bằng không, khởi tạo trực tiếp, khởi tạo giá trị, khởi tạo sao chép, khởi tạo danh sách thành tên chỉ một vài và mỗi tương tác có thể có các tương tác khác nhau tùy thuộc vào ngữ cảnh (khai báo, tham số, trả về, ném, khởi tạo thành viên, v.v.), thuộc tính của kiểu được ràng buộc và biểu thức khởi tạo đầu vào hoặc braced-init-list. Các nhà thiết kế ngôn ngữ cũng làm cho mục tiêu trở nên tương thích ngược với C và các phiên bản cũ hơn của C++, điều này hạn chế những gì họ có thể làm. Phải mất một số nghiên cứu để suy đoán về các chi nhánh của những thay đổi đối với các quy tắc khởi tạo, và những thay đổi có thể tạo ra rất nhiều trường hợp góc không mong muốn. Nếu bạn quan tâm, tôi khuyến khích bạn nghiên cứu tiêu chuẩn và cố gắng làm việc thông qua các tác động của một thay đổi được đề xuất mà bạn đã thiết kế.

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