C++ 03 Chuẩn $ 11,8/1: [class.access.nest]
Các thành viên của một lớp lồng nhau không có quyền truy cập đặc biệt cho các thành viên của một lớp kèm theo, cũng không phải đến các lớp học hoặc các chức năng đã trao tình bạn cho một lớp học kèm theo; các quy tắc truy cập thông thường (điều 11) sẽ được tuân theo. Các thành viên của một lớp kèm theo không có quyền truy cập đặc biệt vào các thành viên của một lớp lồng nhau; các quy tắc truy cập thông thường (điều 11) sẽ được tuân theo.
Nhưng đây là một khiếm khuyết:
45. Access to nested classes
Trong C++ 11, điều này đã được khắc phục: trong 11 lớp lồng nhau C++ làm được tiếp cận với các thành viên private của lớp kèm theo (mặc dù lớp kèm theo vẫn không có quyền truy cập vào các thành viên riêng của các lớp lồng nhau).
C++ 11 Chuẩn 11,7 lớp lồng nhau: nói
Một lớp lồng nhau là thành viên và như vậy có quyền truy cập giống như bất kỳ thành viên khác. Các thành viên của một lớp kèm theo không có quyền truy cập đặc biệt vào các thành viên của một lớp lồng nhau; các quy tắc truy cập thông thường (Điều 11) sẽ được tuân theo.[
class E {
int x;
class B { };
class I {
B b; // OK:E::I can accessE::B
int y;
void f(E* p, int i) {
p->x = i; // OK:E::I can accessE::x
}
};
int g(I* p) {
return p->y; // error:I::y is private
}
};
—end example]
Ví dụ tương tự như một trong những bạn có trong câu hỏi và nó cho thấy rõ hành vi hợp lệ của nó.
Nguồn
2012-01-15 13:31:38
Không, bài viết đó cũng cho biết lớp bên trong không có quyền truy cập vào lớp kèm theo. Nhưng bạn nói đúng là nó hoàn toàn hợp lệ. – hvd
@hvd: Tôi nghĩ bạn đã đúng, đã chỉnh sửa. Tôi đã phải đọc lại nó một vài lần vì nó có vẻ hơi lộn xộn một chút. –
Trong thực tế, nó là hoàn toàn hợp lệ, nhưng (có lẽ khi IBM viết tài liệu và trình biên dịch của nó) không hợp lệ ban đầu: nó đã được thực hiện hợp lệ bởi http://www.open-std.org/JTC1/SC22/WG21/docs /cwg_defects.html#45 – hvd