TGViewer
C++: Хроники Дурки🚑 C++: Хроники Дурки🚑 @cpp_durka · 916 subscribers
Post #67 1.65K
Ой, я когда-нибудь брошу этот сраный язык.

Давайте разберем по шагам.



int main() {
Box b;
b->hi();
}


Что тут происходит? Мы создаем объект типа Box, иииии... вызываем у него оператор ->, а у того, что он вернет вызывает функцию hi(). Логично? Логично!

Смотрим, что такое у нас тип Box.


struct Box {
Proxy operator->() {
return {};
}
};


Ага, значит оператор выдает экземпляр объекта типа Proxy, и вот у него вызывается функция hi(). Логично? Логично.

Смотрим, что такое структура Proxy.


struct Proxy {
Leaf* operator->() {
static Leaf x;
return &x;
}
};


В структуре Proxy функции hi() нет. Ошибка компиляции. Логично? А хрен там плавал.

Уберите детей от мониторов.

Вот этот код компилируется и выводит ok


#include <iostream>

struct Leaf {
void hi() { std::cout << "ok"; }
};

struct Proxy {
Leaf* operator->() {
static Leaf x;
return &x;
}
};

struct Box {
Proxy operator->() {
return {};
}
};

int main() {
Box b;
b->hi();
}


Итак.

У нас С++ разворачивает оператор -> до самого конца. Например сработает даже вот это:


#include <iostream>

struct Leaf {
void hi() { std::cout << "ok"; }
};

struct Proxy4 {
Leaf* operator->() {
static Leaf x;
return &x;
}
};

struct Proxy3 {
Proxy4 operator->() {
return {};
}
};

struct Proxy2 {
Proxy3 operator->() {
return {};
}
};

struct Proxy {
Proxy2 operator->() {
return {};
}
};

struct Box {
Proxy operator->() {
return {};
}
};

int main() {
Box b;
b->hi();
}


Я вот хочу куда-нибудь в шаблонный код загнать, пранкануть, таксказать, коллег.
godbolt.org Compiler Explorer - C++ struct Leaf { void hi() { std::cout << "ok"; } }; struct Proxy { Leaf* operator->() { static Leaf x; return &x; } }; struct Box { Proxy operator->() { return {}; } }; int main() { Box b; b->hi(); }
  • 🔥 28
  • 🤯 25
  • 😁 12
  • ❤ 3
  • 💊 3
  • 🤡 1
More from @cpp_durka
  1. Sep 8, 2026Мошенники заставили пенсионерку из Москвы переписать квартиру на Rust
  2. Aug 31, 2026Всяко разное болезненное есть в С++, из всего болезненного одно из самых болезненных - это…
  3. Aug 24, 2026Если кто не знаком с библиотекой nlohmann/json - она прекрасна. Мои мысли о том, как должн…
  4. Aug 21, 2026#толькосвоимемы Код взят тут. if (dim == 0) idx_dim = i0; else if (dim == 1) idx_dim = i1;…
  5. Aug 17, 2026Ладно, искать баги в компиляторах весело, но недостаточно. Давайте поиграемся в чуть более…
  6. Aug 10, 2026Ладно, разумеется прошлый пост был набросом. Никогда не обновляйте компиляторы без очень с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →