2012-05-16 47 views
8

Mã như thế này có thể hoạt động tốt:loại danh sách khởi tạo trong mảng C++ là gì?

char str[] = {'a', 'b', '\0'}; 

Các trái là một biến tự động (mảng).

Mã như thế này có thể KHÔNG công việc:

char *str = {'a', 'b', '\0'}; 

Phía bên trái là một con trỏ. Con trỏ trỏ đến một không gian không xác định, do đó, điều này sẽ thất bại.

Câu hỏi của tôi là, loại bên phải là gì?

Trong C++ 11, danh sách khởi tạo trở thành std::initializer_list. Nhưng những gì về cũ C++ 03?

+1

Các RHS không phải lúc nào cũng là một 'std :: initializer_list' trong C++ 11. – juanchopanza

+0

@juanchopanza Có tài liệu tóm tắt nào về điều này không? – liuyanghejerry

+1

Có thể [tại đây] (http://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists) và [tại đây] (http://www2.research.att.com/~bs/C++0xFAQ .html # init-list) mặc dù không rõ 100%. Tôi đã phải đau đớn thông qua tiêu chuẩn. – juanchopanza

Trả lời

8

Trong C++ 03 bộ khởi tạo kèm theo dấu ngoặc đơn chỉ là một thiết bị cú pháp có thể được sử dụng để khởi tạo tập hợp (chẳng hạn như mảng hoặc một số loại hoặc cấu trúc nhất định). Nó không có 'loại' và chỉ có thể được sử dụng cho những loại trình khởi tạo cụ thể đó.

8.5.1/2 "Uẩn":

Khi một tổng thể được khởi tạo initializer có thể chứa một initializer-khoản bao gồm một brace- kèm, bằng dấu phẩy danh sách initializer-khoản cho các thành viên của tổng hợp, được viết khi tăng chỉ số hoặc thành viên.

0

Từ dự thảo của C++ 11:

8,5 Initializers

16 Ngữ nghĩa của initializers như sau. Kiểu đích là loại đối tượng hoặc tham chiếu được khởi tạo và loại nguồn là loại biểu thức khởi tạo. Loại nguồn không phải là được xác định khi trình khởi tạo là một dấu ngoặc đơn-init-list hoặc khi nó là một danh sách các biểu thức được hiển thị theo thứ tự là .

+0

Cảm ơn, nhưng đây không phải là những gì tôi thực sự yêu cầu. Tôi đang hỏi về nó trong C++ 03. – liuyanghejerry

4

Trong C++ 03 bên phải là initializer-list. Nó không có bất kỳ kiểu nào, nó chỉ phục vụ mục đích cung cấp một phương tiện để khởi tạo các giá trị cho các định danh.

này được quy định tại:

C++ 03 8.5.1 Initializers [dcl.init]

Một declarator có thể chỉ định một giá trị ban đầu cho các định danh được khai báo. Định danh chỉ định một đối tượng hoặc tham chiếu được khởi tạo. Quá trình khởi tạo được mô tả trong phần còn lại của 8.5 cũng áp dụng cho các khởi tạo được chỉ định bởi các ngữ cảnh cú pháp khác, chẳng hạn như khởi tạo các tham số chức năng với các biểu thức đối số (5.2.2) hoặc khởi tạo các giá trị trả về (6.6.3).

initializer: 
     = initializer-clause 
     (expression-list) 
initializer-clause: 
     assignment-expression 
     { initializer-list ,opt } 
     { } 
initializer-list: 
     initializer-clause 
     initializer-list , initializer-clause 
0
int num [3] = {1,2,3} ; 

int num [0]= 1 ; 
num [1]= 2 ; 
num [2] = 3 ; 
Các vấn đề liên quan