Trước khi C++ 11, chúng tôi chỉ có thể thực hiện khởi tạo trong lớp trên các thành viên const tĩnh của loại tích phân hoặc liệt kê. Stroustrup discusses this in his C++ FAQ, đưa ra các ví dụ sau:C++ 11 cho phép khởi tạo trong lớp các thành viên không tĩnh và không phải thành viên. Những gì đã thay đổi?
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
Và lý do sau đây:
Vì vậy, tại sao những hạn chế bất tiện tồn tại? Một lớp thường được khai báo trong một tệp tiêu đề và một tệp tiêu đề thường được đưa vào nhiều đơn vị dịch. Tuy nhiên, để tránh các quy tắc liên kết phức tạp, C++ yêu cầu mọi đối tượng đều có một định nghĩa duy nhất. Quy tắc đó sẽ bị hỏng nếu C++ cho phép định nghĩa trong lớp các thực thể cần được lưu trữ trong bộ nhớ dưới dạng đối tượng.
Tuy nhiên, C++ 11 thư giãn những hạn chế này, cho phép trong lớp khởi tạo của các thành viên không tĩnh (§12.6.2/8):
Trong một constructor không ủy thác, nếu một thành viên hoặc lớp cơ sở dữ liệu không tĩnh không được chỉ định bởi mem-initializer-id (bao gồm cả trường hợp không có mem-initializer-list vì hàm tạo không có ctor-initializer) và thực thể không phải là lớp cơ sở ảo của lớp trừu tượng (10.4), sau đó là
- nếu pháp nhân là thành viên dữ liệu không tĩnh có brace-hoặc-equal-initializer, pháp nhân được khởi tạo như được chỉ định trong 8.5;
- nếu không, nếu thực thể là thành viên biến thể (9.5), thì không có khởi tạo nào được thực hiện;
- nếu không, thực thể được khởi tạo mặc định (8.5).
Mục 9.4.2 cũng cho phép trong lớp khởi tạo của các thành viên tĩnh không const nếu họ được đánh dấu bằng constexpr
specifier.
Vậy điều gì đã xảy ra với các lý do cho các hạn chế chúng tôi có trong C++ 03? Chúng ta chỉ đơn giản là chấp nhận các "quy tắc liên kết phức tạp" hoặc có một cái gì đó khác thay đổi mà làm cho điều này dễ dàng hơn để thực hiện?
Không có gì xảy ra. Các trình biên dịch đã phát triển thông minh hơn với tất cả các mẫu chỉ tiêu đề này để phần mở rộng tương đối dễ dàng bây giờ. –