Ім'я введеного класу означає, що X
оголошується членом X
, тому пошук імені всередині X
завжди знаходить поточний клас, а не інший, X
який може бути оголошений в тій же області, що додається, наприклад
void X() { }
class X {
public:
static X create() { return X(); }
};
Чи create()
функція створює тимчасовий X
об'єкт або викликає функцію X
? У області простору імен він би викликав функцію, тому мета введеного класу-імені полягає в тому, щоб забезпечити, щоб всередині тіла X
імені завжди знаходився сам клас (тому що пошук імен починається у власній області класу перед тим, як шукати додається сфера застосування).
Це також корисно всередині шаблонів класів, де введене ім'я класу можна використовувати без списку аргументів шаблону, наприклад, використовуючи просто Foo
замість повного ідентифікатора шаблону Foo<blah, blah, blah>
, тому легко посилатися на поточну інстанцію. Див. DR 176 про зміну між C ++ 98 та C ++ 03, яка уточнила це.
Ідея введеного імені класу була присутня в C ++ 98, але термінологія була новою для C ++ 03.
C ++ 98 говорить:
-Ім'я класу вставляється в область , в якій він відразу ж після того , як оголошено ім'я-класу видно. Ім'я класу також вставляється в область самого класу.
Друге речення було змінено DR 147, так що C ++ 03 говорить у [class] / 2:
-Ім'я класу вставляється в область , в якій він відразу ж після того , як оголошено ім'я-класу видно. Ім'я класу також вставляється в область самого класу; це відомо як ім'я введеного класу .
Ще до C ++ 98, ARM має приблизно еквівалентне формулювання, що означає, що ім'я класу завжди можна використовувати в тілі класу для позначення самого класу:
Ім'я класу можна використовувати як ім'я класу навіть у списку членів самого специфікатора класу.
- Наприклад,
class link { link* next; };