fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

C++ geek

C++ geek

رفتن به کانال در Telegram

Учим C/C++ на примерах

نمایش بیشتر
3 504
مشترکین
-224 ساعت
-27 روز
-2630 روز

در حال بارگذاری داده‌ها

کانال‌های مشابه
هیچ داده‌ای
مشکلی وجود دارد؟ لطفاً صفحه را تازه کنید یا با مدیر پشتیبانی ما تماس بگیرید.
اشارات ورودی و خروجی
---
---
---
---
---
---
جذب مشترکین
اکتبر '26
اکتبر '26
+17
در 0 کانال‌ها
سپتامبر '26
+26
در 0 کانال‌ها
Get PRO
اوت '26
+18
در 0 کانال‌ها
Get PRO
ژوئیه '26
+19
در 0 کانال‌ها
Get PRO
ژوئن '26
+31
در 0 کانال‌ها
Get PRO
مه '26
+28
در 0 کانال‌ها
Get PRO
آوریل '26
+25
در 0 کانال‌ها
Get PRO
مارس '26
+33
در 0 کانال‌ها
Get PRO
فوریه '26
+47
در 0 کانال‌ها
Get PRO
ژانویه '26
+57
در 1 کانال‌ها
Get PRO
دسامبر '25
+48
در 0 کانال‌ها
Get PRO
نوامبر '25
+120
در 31 کانال‌ها
Get PRO
اکتبر '25
+71
در 0 کانال‌ها
Get PRO
سپتامبر '25
+130
در 37 کانال‌ها
Get PRO
اوت '25
+78
در 1 کانال‌ها
Get PRO
ژوئیه '25
+102
در 28 کانال‌ها
Get PRO
ژوئن '25
+115
در 20 کانال‌ها
Get PRO
مه '25
+122
در 44 کانال‌ها
Get PRO
آوریل '25
+145
در 37 کانال‌ها
Get PRO
مارس '25
+131
در 38 کانال‌ها
Get PRO
فوریه '25
+140
در 31 کانال‌ها
Get PRO
ژانویه '25
+149
در 33 کانال‌ها
Get PRO
دسامبر '24
+141
در 35 کانال‌ها
Get PRO
نوامبر '24
+133
در 33 کانال‌ها
Get PRO
اکتبر '24
+160
در 30 کانال‌ها
Get PRO
سپتامبر '24
+300
در 29 کانال‌ها
Get PRO
اوت '24
+125
در 18 کانال‌ها
Get PRO
ژوئیه '24
+102
در 0 کانال‌ها
Get PRO
ژوئن '24
+120
در 24 کانال‌ها
Get PRO
مه '24
+124
در 19 کانال‌ها
Get PRO
آوریل '24
+131
در 0 کانال‌ها
Get PRO
مارس '24
+150
در 21 کانال‌ها
Get PRO
فوریه '24
+130
در 18 کانال‌ها
Get PRO
ژانویه '24
+208
در 24 کانال‌ها
Get PRO
دسامبر '23
+161
در 24 کانال‌ها
Get PRO
نوامبر '23
+111
در 18 کانال‌ها
Get PRO
اکتبر '23
+179
در 18 کانال‌ها
Get PRO
سپتامبر '23
+179
در 0 کانال‌ها
Get PRO
اوت '23
+106
در 0 کانال‌ها
Get PRO
ژوئیه '23
+158
در 0 کانال‌ها
Get PRO
ژوئن '23
+120
در 0 کانال‌ها
Get PRO
مه '23
+129
در 0 کانال‌ها
Get PRO
آوریل '23
+113
در 0 کانال‌ها
Get PRO
مارس '23
+44
در 0 کانال‌ها
Get PRO
فوریه '23
+68
در 0 کانال‌ها
Get PRO
ژانویه '23
+128
در 0 کانال‌ها
Get PRO
دسامبر '22
+144
در 0 کانال‌ها
Get PRO
نوامبر '22
+139
در 0 کانال‌ها
Get PRO
اکتبر '22
+226
در 0 کانال‌ها
Get PRO
سپتامبر '22
+1 184
در 0 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
27 اکتبر+1
26 اکتبر+1
25 اکتبر+3
24 اکتبر+1
23 اکتبر+1
22 اکتبر+1
21 اکتبر0
20 اکتبر+2
19 اکتبر0
18 اکتبر0
17 اکتبر+1
16 اکتبر0
15 اکتبر0
14 اکتبر0
13 اکتبر+1
12 اکتبر0
11 اکتبر0
10 اکتبر+1
09 اکتبر0
08 اکتبر+1
07 اکتبر+1
06 اکتبر0
05 اکتبر0
04 اکتبر0
03 اکتبر0
02 اکتبر+2
01 اکتبر0
پست‌های کانال
Pipes В C++ пайпы (pipes) представляют собой механизм для односторонней связи между процессами. Они позволяют передавать данн
Pipes В C++ пайпы (pipes) представляют собой механизм для односторонней связи между процессами. Они позволяют передавать данные из одного процесса в другой, где один процесс выступает в роли писателя (write end), а другой процесс выступает в роли читателя (read end) пайпа. Для работы с пайпами вы можете использовать системные вызовы, такие как pipe, fork и функции чтения/записи (read и write), доступные в POSIX-совместимых операционных системах. Обратите внимание, что дескрипторы чтения и записи пайпа должны быть закрыты в соответствующих процессах с помощью close, чтобы гарантировать правильное завершение операций чтения и записи. 📲 Мы в MAX ➡️ @cpp_geek

2
🕵️‍♂️ Анатомия лямбд: Что скрывает компилятор и где прячутся тормоза? Мы привыкли писать auto func = [x](int y) { return x + y; }; и думать о лямбдах как о «магических» встроенных функциях. Но в C++ нет никакой магии. На уровне компилятора лямбд не существует. Лямбда-выражение - это просто синтаксический сахар для создания анонимного класса (функтора). ⚙️ Что происходит под капотом? Когда вы пишете такой код: int multiplier = 10; auto doMath = [multiplier](int val) { return val * multiplier; }; Компилятор молча генерирует для вас класс с уникальным непроизносимым именем и перегруженным оператором (): // Примерно это генерирует компилятор: class __Lambda_Uniq_42 { int multiplier; // Захваченная переменная стала полем класса public: __Lambda_Uniq_42(int m) : multiplier(m) {} // Сам код лямбды: auto operator()(int val) const { return val * multiplier; } }; // А ваше создание лямбды превращается в: auto doMath = __Lambda_Uniq_42(multiplier); Вывод №1: Блок захвата [...] - это просто конструктор класса и его поля. Если вы захватываете по ссылке [&x], полем класса станет ссылка. 🚨 Где прячутся скрытые аллокации? Сама по себе лямбда создается на стеке. Никаких new или malloc не происходит. Это работает мгновенно. Тормоза начинаются, когда мы решаем сохранить лямбду с помощью std::function. // 🚀 БЫСТРО (Zero-cost) auto fast_lambda = [a, b, c]() { ... }; // 🐢 МОЖЕТ БЫТЬ МЕДЛЕННО (Heap allocation) std::function<void()> slow_lambda = [a, b, c, d, e]() { ... }; std::function - это тяжелая обертка (Type Erasure). Она должна уметь хранить любой вызываемый объект с нужной сигнатурой. Чтобы избежать выделения памяти в куче, в std::function встроена оптимизация для маленьких объектов (SBO - Small Buffer Optimization). Размер этого буфера обычно равен размеру нескольких указателей (например, 16-32 байта). * Если ваша лямбда захватывает мало данных (или ничего) - она поместится во внутренний буфер std::function. Аллокаций нет. * Если вы написали [=] и захватили кучу тяжелых переменных (или несколько толстых строк/векторов по значению) - размер сгенерированного класса превысит буфер. std::function будет вынужден вызвать new и выделить память в куче. 💡 Правила чистого кода с лямбдами: 1. Храните через auto: Всегда используйте auto для локальных лямбд. Это бесплатно. 2. Передавайте через шаблоны: Если функция принимает лямбду, лучше сделать её шаблоном template <typename Func> void DoWork(Func f), чем принимать std::function. Шаблон сохранит тип лямбды и позволит компилятору заинлайнить код. 3. Используйте std::function только на границах API: Когда вам действительно нужно хранить функции разного типа в одном контейнере (например, вектор коллбеков) или передать их через границу динамической библиотеки. 4. Не пишите [=] вслепую: Захватывайте только то, что реально нужно. Это спасет и от лишних аллокаций, и от случайного копирования тяжелых объектов. #cpp #lambdas #optimization #memory #under_the_hood #coding #tips 📲 Мы в MAX ➡️ @cpp_geek
379
3
🎥 Вебинар по C++: Магия чисел в C++: как заставить компилятор считать за нас Программа ещё не запущена, а таблица значений у
🎥 Вебинар по C++: Магия чисел в C++: как заставить компилятор считать за нас Программа ещё не запущена, а таблица значений уже готова. C++ позволяет выполнить часть вычислений на этапе компиляции и передать программе готовый результат. 👉 На уроке разберём: - Как выполнять вычисления на этапе компиляции. - Как получать числа Фибоначчи и факториал до запуска программы. - Как поручить компилятору генерацию таблиц. 🤓 Что получите по итогам: - Поймёте, как компилятор может вычислять результаты ещё при сборке программы. - Разберёте этот принцип на конкретных задачах: от факториала и чисел Фибоначчи до генерации таблиц. 🧠 Вебинар приурочен к старту курса «C++-разработчик. Продвинутый уровень», который помогает системно усилить навыки: от современных стандартов C++20 и C++23 до проектирования, многопоточности, работы с сетью, базами данных и большими объёмами информации. 👉 Для участия зарегистрируйтесь: https://vk.cc/d2Szzw Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
564
4
std::initializer_list Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делат
std::initializer_list Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делать с C-массивами. Это справедливо и для вложенных контейнеров. Скажите спасибо С++11. 📲 Мы в MAX ➡️ @cpp_geek
500
5
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 24
536
6
std::hash Это структура шаблонного класса, определенная в заголовочном файле. Она предоставляет хеш-функцию для хэширования р
std::hash Это структура шаблонного класса, определенная в заголовочном файле. Она предоставляет хеш-функцию для хэширования различных типов данных, включая встроенные и пользовательские. std::hash используется, например, в ассоциативных контейнерах, таких как std::unordered_map и std::unordered_set, для быстрого доступа к элементам по ключу. Для пользовательского типа данных требуется явная специализация структуры std::hash для корректной работы хэширования. что и поток, с которым он связан. 📲 Мы в MAX ➡️ @cpp_geek
549
7
Что случится, если exception выйдет за пределы потока? Если exception выходит за пределы потока, то оно не может быть обработ
Что случится, если exception выйдет за пределы потока? Если exception выходит за пределы потока, то оно не может быть обработано на текущем уровне, т. к. он уже завершен. В таком случае исключение будет зарегистрировано как неперехваченное и может привести к аварийному завершению программы. Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан. 📲 Мы в MAX ➡️ @cpp_geek
577
8
Dependency Injection Dependency Injection (DI) — это паттерн проектирования, который позволяет управлять зависимостями между
Dependency Injection Dependency Injection (DI) — это паттерн проектирования, который позволяет управлять зависимостями между объектами. Он помогает разделить создание объектов от их использования и обеспечить более гибкую и тестируемую архитектуру программы. В DI объекты получают свои зависимости не напрямую, а через внешний источник, который их предоставляет. Этот источник называется контейнером внедрения зависимостей. Контейнер отвечает за создание и управление зависимостями, а объекты получают их через конструкторы, методы или свойства. 📲 Мы в MAX ➡️ @cpp_geek
780
9
🎥 Вебинар по C++: Паттерн многопоточного программирования «Producer-Consumer» Когда несколько потоков одновременно работают
🎥 Вебинар по C++: Паттерн многопоточного программирования «Producer-Consumer» Когда несколько потоков одновременно работают с данными, недостаточно просто «запустить работу параллельно». Нужно правильно организовать передачу задач между потоками, не потерять данные и избежать ситуаций, когда приложение внезапно зависает. 👉 Разберём один из самых распространённых паттернов многопоточной разработки - Producer-Consumer. На практическом примере посмотрим, как один или несколько потоков создают задачи, другие их обрабатывают и какую роль между ними играет общая очередь. Отдельное внимание уделим проблемам, с которыми разработчики сталкиваются на практике: гонкам данных, зависаниям, неправильной синхронизации и ситуации, когда задачи поступают быстрее, чем успевают обрабатываться. 🤓 План вебинара: - Producer-Consumer: какую задачу решает паттерн - Собираем Producer-Consumer на C++ - Почему многопоточный код «иногда работает, а иногда нет» - Что делать, если Producer работает быстрее Consumer - Разбор итоговой реализации и вопросы 🧠 Вебинар приурочен к старту курса «C++-разработчик. Продвинутый уровень», который помогает системно усилить навыки: от современных стандартов C++20 и C++23 до проектирования, многопоточности, работы с сетью, базами данных и большими объёмами информации. 👉 Для участия зарегистрируйтесь: https://vk.cc/d220m6 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
855
10
Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введенное в стандарте языка C++17. Это м
Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно. Существуют три варианта execution policy: - seq: выполняет алгоритм последовательно. - par: выполняет алгоритм параллельно, используя все доступные ядра процессора. - par_unseq: выполняет алгоритм параллельно и может использовать неупорядоченное исполнение. Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как std::for_each, std::transform, std::reduce и другими. Например, код выше выполняет алгоритм std::for_each параллельно. 📲 Мы в MAX ➡️ @cpp_geek
634
11
В чем разница между git fetch и git pull? Разница между этими командами заключается в том, что когда вы используете команду g
В чем разница между git fetch и git pull? Разница между этими командами заключается в том, что когда вы используете команду git fetch, Git извлекает последние изменения из удаленного репозитория в ваш локальный репозиторий, но оставляет эти изменения в отдельной ветке git origin. А команда git pull извлекает и интегрирует (скачивает и сливает) последние изменения из удаленного репозитория в вашу текущую ветку работы. 📲 Мы в MAX ➡️ @cpp_geek
723
12
std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore. Она
std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore. Она может использоваться для распаковки кортежей или пары значений в отдельные переменные. Например, если у вас есть функция, которая возвращает std::pair или std::tuple, вы можете использовать std::tie, чтобы присвоить значения этого кортежа отдельным переменным. В этом примере мы используем std::tie для распаковки результата вызова set_of_s.insert(value) в две переменные: итератор iter и логическую переменную inserted. Это позволяет нам проверить, было ли значение успешно вставлено в набор. 📲 Мы в MAX ➡️ @cpp_geek
677
13
move constructor Move-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного об
move constructor Move-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного объекта в другой, без необходимости копирования данных. Он используется для реализации семантики перемещения (move semantics) и оптимизации работы с временными объектами. Move-конструктор принимает rvalue ссылку (&&) на объект, который будет перемещен, и выполняет простое копирование указателей на данные, а не их фактическое копирование. Использование move-конструктора позволяет избежать лишних копирований данных и повысить производительность при работе с большими или ресурсоемкими объектами. 📲 Мы в MAX ➡️ @cpp_geek
740
14
Move-only объекты и почему std::unique_ptr нельзя копировать Многие удивляются, когда компилятор ругается: «unique_ptr не имеет конструктора копирования». Это не баг, а фича: он move-only. Логика простая: владелец ресурса должен быть только один. #include <memory> #include <iostream> int main() { std::unique_ptr<int> p1 = std::make_unique<int>(42); // std::unique_ptr<int> p2 = p1; // ❌ ошибка копирования std::unique_ptr<int> p2 = std::move(p1); // ✅ перенос std::cout << *p2 << "\n"; // 42 std::cout << (p1 ? "not null" : "null") << "\n"; // null } Ключевой момент: после std::move старый указатель «обнуляется», чтобы избежать двойного освобождения памяти. Если нужен shareable ресурс – используйте std::shared_ptr. Но помните: это дороже (счётчик ссылок, атомики). Частая ошибка на собеседованиях: «почему нельзя вернуть unique_ptr по значению?» - на самом деле можно! Он спокойно двигается: std::unique_ptr<int> make_ptr() { return std::make_unique<int>(99); // move происходит неявно } 👉 Правило: если объект владеет чем-то уникально – делайте его move-only (удалите копирование). Это повышает безопасность кода и явно выражает семантику владения. 📲 Мы в MAX ➡️ @cpp_geek
619
15
Генерируем пароли с помощью C++ Эта программа создает константы для допустимых символов в пароле и для длины пароля. Затем он
Генерируем пароли с помощью C++ Эта программа создает константы для допустимых символов в пароле и для длины пароля. Затем она инициализирует генератор случайных чисел и генерирует пять случайных паролей. Каждый пароль формируется путем выбора случайного символа из всего набора символов. Этот процесс повторяется до достижения желаемой длины пароля. 📲 Мы в MAX ➡️ @cpp_geek
610
16
Сейчас покажу вам простой, но мощный приём для ускорения компиляции - разделение объявления и реализации шаблонов с использованием explicit instantiation. Все мы знаем, что шаблоны в C++ реализуются в заголовочных файлах. Это значит, что каждый .cpp файл, который включает такой заголовок, заново инстанцирует шаблон. Результат - долгое время компиляции и раздутый бинарник. 🔧 Что можно сделать? Разделяем интерфейс и реализацию: // MyTemplate.hpp #pragma once template<typename T> class MyTemplate { public: void doSomething(); }; // MyTemplate.cpp #include "MyTemplate.hpp" #include <iostream> template<typename T> void MyTemplate<T>::doSomething() { std::cout << "Doing something\n"; } // Явная инстанциация template class MyTemplate<int>; Теперь в клиентском коде: #include "MyTemplate.hpp" int main() { MyTemplate<int> obj; obj.doSomething(); } ✅ Это даст: - Сокращение времени компиляции - Чище зависимости - Потенциально меньший размер бинарника Но помните: explicit instantiation работает, только если вы заранее знаете типы, с которыми будете использовать шаблон. 📲 Мы в MAX ➡️ @cpp_geek
746
17
Что такое виртуальный деструктор и зачем он используется в C++? В C++ виртуальный деструктор используется для правильного освобождения памяти при удалении объекта через указатель на базовый класс. Если базовый класс имеет виртуальный деструктор, то при удалении объекта через указатель на базовый класс будет вызван деструктор не только базового класса, но и всех его производных классов. Это позволяет избежать утечек памяти и неопределенного поведения при работе с полиморфными объектами. Если виртуального деструктора не объявлено в базовом классе, то при удалении производного объекта через указатель на базовый класс будут вызваны только деструкторы базового класса, что может привести к утечкам памяти и неопределенному поведению. 📲 Мы в MAX ➡️ @cpp_geek
776
18
🧵 Сегодня покажу вам, как удобно логгировать значения в отладке с помощью макроса, который реально упрощает жизнь. Когда мы отлаживаем код, часто хочется быстро вывести значения переменных. Писать std::cout << "x: " << x << std::endl; каждый раз — боль. Давайте упростим: #include <iostream> #define LOG(var) std::cout << #var << " = " << (var) << std::endl; int main() { int x = 42; double pi = 3.1415; LOG(x); // x = 42 LOG(pi); // pi = 3.1415 } Фишка в том, что #var превращает имя переменной в строку. А (var) - значение. 🔥 Такой макрос отлично заходит при написании алгоритмов, отладки функций, проверки значений — и при этом делает код аккуратнее. Хочешь улучшить - можно сделать вывод в файл или добавить таймстемпы. 📲 Мы в MAX ➡️ @cpp_geek
705
19
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 24
539
20
std::move vs std::forward: когда и что использовать Сегодня покажу вам коротко, чем отличаются std::move и std::forward. - std::move(obj) — безусловно превращает объект в rvalue. После этого объект считается "пустым" для повторного использования (в рамках контракта move). Используем, когда мы точно хотим "забрать" ресурсы. - std::forward<T>(obj) — условно делает rvalue, если изначально пришёл rvalue. То есть это "perfect forwarding" для шаблонных функций. Пример: #include <utility> #include <string> #include <iostream> template <typename T> void wrapper(T&& arg) { process(std::forward<T>(arg)); // сохраняет rvalue/lvalue-семантику } void process(const std::string& s) { std::cout << "Lvalue: " << s << '\n'; } void process(std::string&& s) { std::cout << "Rvalue: " << s << '\n'; } int main() { std::string str = "Hello"; wrapper(str); // Lvalue wrapper(std::move(str)); // Rvalue } Запомните: - std::move - "забрать". - std::forward - "передать как есть". 📲 Мы в MAX ➡️ @cpp_geek
498