#опытным
Спасибо, @Ivaneo, за любезно предоставленный примерчик в рамках рубрики #ЧЗХ.
"Век живи - век учись" - сказал Луций Сенека.
"Век живи - век учи С++" - реалии нашей жизни.
Просто посмотрите на следующий код:
struct Foo
{
void Bar();
};
void Foo::Foo::Foo::Foo::Foo::Foo::Foo::Foo::Foo::Foo::Foo::Foo::Bar()
{
printf("Foofoo!");
}
int main()
{
Foo f;
f.Bar();
return 0;
}
И он компилируется.
WAT?
Это называется injected class name. Имя класса доступно из скоупа этого же класса. Так сделано для того, чтобы поиск имени
X внутри класса X всегда разрешался именно в этот класс.Такое поведение может быть полезно в таком сценарии:
void X() { }
class X {
public:
static X Сreate() { return X(); }
};injected class name гарантирует, что из метода
Сreate будет возвращен именно инстанс класса Х, а не результат вызова функции Х.Это также полезно внутри шаблонов классов, где имя класса можно использовать без списка аргументов шаблона, например, используя просто Foo вместо полного идентификатора шаблона Foo<blah, blah, blah>.
Ну и побочным эффектом такого поведения является возможность написания длиннющей цепочки из имен класса.
Так что это не у вас в глазах двоится, это плюсы такие шебутные)
Find yourself within. Stay cool.
#cppcore