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>();
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
@ dasblinkenlight rõ ràng là không (xem xét MVP). –
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