Tại sao có một tên lớp tiêm?


147

Gần đây, tôi thấy một tính năng C ++ kỳ lạ: tên lớp được tiêm .

class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...

Nhưng tôi không thể hiểu tại sao tính năng này là cần thiết. Có thực hành nào yêu cầu tính năng này không?

Và tôi nghe nói tính năng này không tồn tại trong C ++ cũ. Sau đó, khi nó được giới thiệu? C ++ 03? C ++ 11?


Bạn ơi, bạn có thể xem trên Skype không? Tôi không thể liên lạc với bạn
Irinel Iovan

Câu trả lời:


162

Tên lớp được chèn có nghĩa Xlà được khai báo là thành viên của X, do đó, tra cứu tên bên trong Xluôn tìm thấy lớp hiện tại, không phải là tên khác Xcó thể được khai báo ở cùng phạm vi kèm theo, ví dụ:

void X() { }
class X {
public:
  static X create() { return X(); }
};

create()hàm tạo một Xđối tượng tạm thời hoặc gọi hàm X? Ở phạm vi không gian tên, nó sẽ gọi hàm, vì vậy mục đích của tên lớp được chèn là để đảm bảo rằng trong phần thân của Xtên luôn tìm thấy chính lớp đó (vì việc tra cứu tên bắt đầu trong phạm vi riêng của lớp trước khi tìm trong bao vây phạm vi).

Nó cũng hữu ích bên trong các mẫu lớp, trong đó tên lớp được chèn có thể được sử dụng mà không có danh sách đối số mẫu, ví dụ: sử dụng đơn giản Foothay vì id mẫu đầy đủ Foo<blah, blah, blah>, vì vậy thật dễ dàng để tham khảo tức thời hiện tại. Xem DR 176 để biết sự thay đổi giữa C ++ 98 và C ++ 03 đã làm rõ điều đó.

Ý tưởng về tên lớp được thêm vào đã có trong C ++ 98, nhưng thuật ngữ này là mới đối với C ++ 03.

C ++ 98 nói:

Một tên lớp được chèn vào phạm vi mà nó được khai báo ngay sau khi nhìn thấy tên lớp . Tên lớp cũng được chèn vào phạm vi của chính lớp đó.

Câu thứ hai đã được thay đổi bởi DR 147, vì vậy C ++ 03 nói trong [class] / 2:

Một tên lớp được chèn vào phạm vi mà nó được khai báo ngay sau khi nhìn thấy tên lớp . Tên lớp cũng được chèn vào phạm vi của chính lớp đó; cái này được gọi là tên lớp tiêm .

Ngay cả trước C ++ 98, ARM có từ ngữ gần tương đương, có nghĩa là tên của lớp luôn có thể được sử dụng trong thân lớp để chỉ chính lớp đó:

Tên của một lớp có thể được sử dụng làm tên lớp ngay cả trong danh sách thành viên của chính trình xác định lớp.

  • Ví dụ,

    class link { link* next; };


2
Tôi đã được hỏi rằng khá thường xuyên, nhưng không bao giờ có thể xây dựng một ví dụ đơn giản chỉ ra vấn đề. Vì vậy, +1 cho ví dụ.
dhein

1
Điều này có thể được nhìn thấy rõ nếu bạn chạy clang ++ your_program.cpp -Xclang -ast-dump và bạn thấy lớp của mình và sau đó là một nút con của lớp được tiêm.
xaxxon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.