2013-01-09 30 views
10

Trong C và C++, ta có thể khởi tạo mảng và cấu trúc sử dụng niềng răng:vô hướng khởi tạo với niềng răng

int a[] = {2, 3, 5, 7}; 
entry e = {"answer", 42}; 

Tuy nhiên, trong a talk from 2007, Bjarne đề cập rằng cú pháp này cũng làm việc cho vô hướng. Tôi đã thử:

int i = {7}; 

Và nó thực sự hoạt động! Lý do đằng sau việc cho phép khởi tạo vô hướng với niềng răng là gì?

Lưu ý: Tôi đặc biệt không phải nói về khởi tạo đồng bộ C++ 11. Đây là C89 cũ và C++ 98.

+1

Nó chỉ là một phần của ngữ pháp của C++. Cho phép tất cả các đối tượng được khởi tạo theo cách này là phù hợp hơn và có thể mô phỏng việc thực hiện. –

+0

trình biên dịch trước C++ 11 nào bạn đã thử? – TemplateRex

+0

Chủ đề tương tự: [Niềng răng xung quanh chuỗi chữ trong khai báo mảng char hợp lệ?] (Http://stackoverflow.com/questions/10147264/braces-around-string-literal-in-char-array-declaration-valid-eg-char -s) – Nawaz

Trả lời

4

Lý do đằng sau việc cho phép khởi tạo vô hướng với dấu ngoặc nhọn là gì?

int là POD. Vì vậy, việc khởi tạo cú đúp được cho phép trong trường hợp int (và đối với tất cả các kiểu dựng sẵn), vì nó làm cho cú pháp khởi tạo nhất quán với các POD khác.

Ngoài ra, tôi đoán bất cứ điều gì lý do đằng sau C++ 11 Cú pháp khởi tạo đồng nhất, cũng (một phần) áp dụng cho cú pháp này được C++ 03 cho phép. Nó chỉ là C++ 03 đã không mở rộng này để bao gồm các loại không pod như các thùng chứa tiêu chuẩn.

Tôi có thể thấy một nơi khởi tạo này hữu ích trong C++ 03.

template<typename T> 
void f() 
{ 
    T obj = { size() } ; //T is POD: built-in type or pod-struct 
    //code 
} 

Bây giờ này có thể được khởi tạo với struct mà bắt đầu với một thành viên phù hợp, cũng như bất kỳ loại số học:

struct header 
{ 
    size_t size; //it is the first member 
    //... 
}; 

f<header>(); //body becomes : header obj = { size(); }; which is fine 
f<size_t>(); //body becomes : size_t obj = { size(); }; which is fine 

Cũng lưu ý POD rằng, cho dù loại struct hoặc built-in, cũng có thể được khởi tạo thống nhất như:

header h = header(); //value-initialized 
int i = int(); //value-initialized 

vì vậy, tôi tin rằng một lý do là nhất quán!

3

Lý do không được nhắc đến, nhưng từ một 2005 C++ Standard draft, 8,5 Initializers [dcl.init], khoản 14

Nếu T là một kiểu vô hướng, sau đó tuyên bố có dạng T x = { a }; tương đương với T x = a;

Lưu ý rằng C++ 98 tiêu chuẩn chỉ cho phép initializers cú đúp cho bản sao-khởi T x = { a }, và không cho khởi tạo trực tiếp T x { a }, mà chỉ T x(a) công trình.

CẬP NHẬT: xem thêm này question

1

C++ lẽ thừa hưởng điều này từ C. Trong C nguyên nhân chủ yếu là phải có một cú pháp initilizer độc đáo, đặc biệt đối với một initializer mặc định. Trong C, bộ khởi tạo mặc định là {0}.

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