Việc khởi tạo các thành viên không tĩnh không thể được thực hiện như thế này trước C++ 11. Nếu bạn biên dịch với trình biên dịch C++ 11, nó sẽ vui vẻ chấp nhận mã bạn đã đưa ra.
Tôi tưởng tượng rằng lý do không cho phép nó ngay từ đầu là do khai báo thành viên dữ liệu không phải là định nghĩa. Không có đối tượng nào được giới thiệu. Nếu bạn có một thành viên dữ liệu chẳng hạn như int x;
, không có đối tượng int
được tạo cho đến khi bạn thực sự tạo đối tượng thuộc loại của lớp. Vì vậy, một initializer trên thành viên này sẽ gây hiểu nhầm. Chỉ trong quá trình xây dựng, một giá trị có thể được gán cho thành viên, đó chính xác là danh sách khởi tạo thành viên.
Cũng có một số vấn đề kỹ thuật cần thực hiện trước khi khởi tạo thành viên không tĩnh. Hãy xem xét các ví dụ sau:
struct S {
int i(x);
// ...
static int x;
};
struct T {
int i(x);
// ...
typedef int x;
};
Khi những cấu trúc đang được phân tích, tại thời điểm phân tích các thành viên i
, nó là mơ hồ cho dù đó là một tuyên bố thành viên dữ liệu (như trong S
) hoặc khai báo hàm thành viên (như trong số T
).
Với chức năng bổ sung, đây không phải là vấn đề vì bạn không thể khởi tạo thành viên bằng cú pháp parantheses này. Bạn phải sử dụng một cú đúp-hoặc-bằng-initializer như:
int i = x;
int i{x};
Những chỉ có thể là dữ liệu thành viên và vì vậy chúng tôi không có vấn đề nữa.
Xem đề xuất N2628 để có cái nhìn kỹ lưỡng hơn về các vấn đề cần được xem xét khi đề xuất trình khởi tạo thành viên không tĩnh.
Nguồn
2013-03-16 16:59:17
Bạn có thể sử dụng C++ 11. – chris
Trình biên dịch của tôi nói với tôi: * "Lỗi: bộ khởi tạo thành viên dữ liệu không được phép" *. – danijar
Vì vậy, trình biên dịch của bạn không hỗ trợ (tất cả) C++ 11. –