en
Feedback
C++ Moscow

C++ Moscow

Open in Telegram

Информационный канал московского сообщества программистов на C++ Чат: @cppmoscow_chat Бот обратной связи: @cppmoscow_bot Организатор: @eoanermine

Show more
302
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
Каким будет результат работы программы выше?
Anonymous voting

#quiz #code Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве. #include <type_traits> #include <iostream> using namespace std; struct X { int f() const&&{ return 0; } }; int main() { auto ptr = &X::f; cout << is_same_v<decltype(ptr), int()> << is_same_v<decltype(ptr), int(X::*)()>; }

#proposals #resources Каждый месяц комитет по стандартизации C++ (также известный как WG21) публикует свою „переписку“: все предложения (пропозалы) в стандарт за последний месяц, каждое из которых по результатам голосования среди членов WG21 может быть в него включено. Совсем недавно, например, была опубликована переписка за сентябрь. Какие пропозалы из нее вам кажутся наиболее интересными или каких полезных фич, по вашему мнению, в этом списке не хватает? Присоединяйтесь к обсуждению в комментариях!

#quiz #explanation В данном коде копирование может произойти лишь в трех местах: 1. std::initializer_list<C> i{c} 2. Первый f(i) 3. Второй f(i) Так в каких же из них оно происходит? [dcl.init.list] определяет то, как создается std::initializer_list следующим образом: An object of type std::initializer_list<E> is constructed from an initializer list as if the implementation generated and materialized a prvalue of type “array of N const E”, where N is the number of elements in the initializer list. Each element of that array is copy-initialized with the corresponding element of the initializer list, and the std::initializer_list<E> object is constructed to refer to that array. То есть, когда мы создаем i, создается временный массив объектов типа C, инициализируемый копированием. Так что в пункте 1 копирование действительно происходит и на экран выводится 1. Далее мы дважды вызываем функцию f, принимающую аргумент по значению. Так что для каждого из вызовов делается копия std::initializer_list. Вызывает ли это копирование всех его элементов? Нет, так как std::initializer_list не владеет своими элементами. Как было сказано в цитате выше, он лишь ссылается на временный массив. И это дополнительно поясняется в [initializer_list.syn]: Copying an initializer list does not copy the underlying elements Ответ: 1

Каким будет результат работы программы выше?
Anonymous voting

#quiz #code Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве. #include <initializer_list> #include <iostream> class C { public: C() = default; C(const C&) { std::cout << 1; } }; void f(std::initializer_list<C> i) {} int main() { C c; std::initializer_list<C> i{c}; f(i); f(i); }

#quiz #explanation Обычно static_assert(false) вызывает ошибку компиляции, но в данном случае он используется в шаблоне, который нигде в программе не инстанцируется. Так что логично было бы ожидать, что в этом коде все хорошо и он выведет единицу. Однако, согласно C++20 и более ранним стадартам, поведение будет иным: [temp.res.general#8] The program is ill-formed, no diagnostic required, if: — ... — a hypothetical instantiation of a templated entity immediately following its definition would be ill-formed due to a construct that does not depend on a template parameter... static_assert(false) не зависит от шаблонных параметров и, если бы мы инстанцировали класс A немедленно после его объявления, он бы всегда вызывал ошибку компиляции (то есть, был ill-formed). Так что наша программа, согласно стандарту C++20, является IFNDR (ill-formed, no diagnostic required) — то есть, ее поведение неопределено. Но в C++23 формулировки были изменены: [temp.res.general#6] The program is ill-formed, no diagnostics required, if: — ... — a hypothetical instantiation of a templated entity immediately following its definition would be ill-formed due to a construct (other than a static_assert-declaration that fails) that does not depend on a template parameter Появилось исключение из правил именно для static_assert, так что в C++23 данный код корректен. На экран будет выведено 1

Каким будет результат работы программы выше?
Anonymous voting

#quiz #code Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве. #include <iostream> using namespace std; template <typename T> struct A { static_assert(false); }; int main() { cout << 1; }

#digest Подборка самых интересных новостей и материалов из мира C++ за последние две недели (4 сентября – 17 сентября 2023) Читать далее на Хабре

#digest Подборка самых интересных новостей и материалов из мира C++ за последние две недели (21 августа 2023 – 3 сентября 2023) Читать далее на Хабре

Доклады на какие темы вам было бы интересно послушать в следующий раз? Как можно было бы сделать доклады с предыдущей встречи лучше? Помогите нам стать лучше и сформировать интересную программу для следующей встречи, поделитесь своим мнением через Яндекс.Формы!

Записи докладов с прошедшей встречи теперь доступны на нашем канале! 1. Бэкенд на плюсах для нормальных людей — Данил Сидорук — C++ Moscow №0 2. std::expected. Обработка ошибок в C++ 23 — Илья Быконя — C++ Moscow №0 Кроме того, был размещен в публичный доступ репозиторий с кодом к вопросикам, которые были на прошедшей викторине. А для быстрой навигации по всему этому добру был создан отдельный репозиторий.

Спасибо всем, кто посетил наш первый митап оффлайн и всем, кто ждал трансляции! К сожалению, по техническим причинам ее провести не удалось — однако, в течение недели доклады будут перезаписаны и опубликованы в хорошем качестве на нашем канале. Не всё получилось идеально, но мы не намерены останавливаться на достигнутом. Мы проанализируем допущенные ошибки, чтобы наш второй митап прошел лучше, интереснее и полезнее (и точно с трансляцией 😉). Ожидайте анонсов!

#meetup Митап стартует уже через три часа и мы ждём всех, кто успел на него зарегистрироваться. 17:30–20:00, Москва, 2-й Донской проезд, д. 9, стр. 3 Все дальнейшие обновления касательно нашей встречи будут публиковаться в комментариях к этому посту. Так что заходите в наш чат, чтобы ничего не пропустить.

#meetup Наш митап уже завтра! Успейте зарегистрироваться, если хотите посетить встречу оффлайн — до конца регистрации осталось всего несколько часов! И, вне зависимости от того, будете ли вы завтра на мероприятии оффлайн, давайте познакомимся. Расскажите о себе и своем плюсовом опыте в комментариях: учитесь вы или работаете, в какой отрасли применяете плюсы на работе и в быту (hardware, game development, developer tools, прикладное ПО) и сколько уже лет вы с ними знакомы...

И вот уже пара дней осталась до нашей первой встречи! Напоминаем, что она пройдет 18 августа (Пт) с 17:30 до 20:00 по адресу
И вот уже пара дней осталась до нашей первой встречи! Напоминаем, что она пройдет 18 августа (Пт) с 17:30 до 20:00 по адресу Москва, 2-й Донской проезд, д. 9, стр. 3 (оффлайн + онлайн трансляция докладов) Запланированные активности: 1. Бэкенд на плюсах для нормальных людей — доклад 2. std::expected. Обработка ошибок в C++23 — доклад 3. Викторина по мотивам C++ Quiz 4. Кушать снеки и пить напитки, просто хорошо пообщаться и провести время Если вы планируете посетить мероприятие оффлайн, то вам необходимо зарегистрироваться на него по ссылке, иначе вы не сможете на него попасть. Как доехать и как дойти до места нашей встречи от станции метро «Ленинский проспект» — по ссылке и на прикрепленной картинке. Остались вопросы? Пишите в комментарии, на все ответим!

До нашей первой встречи осталась всего неделя! А значит, если вы планируете посетить ее очно, самое время на нее зарегистрироваться 😉 Без регистрации вы не сможете попасть на площадку, а зарегистрировавшись заранее, вы поможете нам: мы сможем точнее прикинуть планируемое количество участников, что для нас очень важно в плане планирования мероприятия.

В ряду докладов, запланированных на нашу ближайшую встречу, пополнение :) Илья Быконя расскажет нам о новом способе обработки ошибок, появившемся в C++23

std::expected. Обработка ошибок в C++23 Обработка ошибок в современном C++ представляет целый букет различных инструментов. С одной стороны, у нас есть тысячи способов получения кодов ошибок (std::errno, out-параметры, просто возвращаемые значения). С другой — исключения, запрещённые на ряде проектов и накладывающие ограничения на код и оптимизации. В C++23 в этом наборе случилось пополнение. Нам дали std::expected. Тип, позволяющий совместить производительность кодов ошибок и надёжность исключений.