C++ Moscow
Open in Telegram
Информационный канал московского сообщества программистов на C++ Чат: @cppmoscow_chat Бот обратной связи: @cppmoscow_bot Организатор: @eoanermine
Show more302
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
302
#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::*)()>;
}302
#proposals #resources
Каждый месяц комитет по стандартизации C++ (также известный как WG21) публикует свою „переписку“: все предложения (пропозалы) в стандарт за последний месяц, каждое из которых по результатам голосования среди членов WG21 может быть в него включено.
Совсем недавно, например, была опубликована переписка за сентябрь.
Какие пропозалы из нее вам кажутся наиболее интересными или каких полезных фич, по вашему мнению, в этом списке не хватает? Присоединяйтесь к обсуждению в комментариях!
302
#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
Ответ: 1302
#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);
}302
#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 данный код корректен. На экран будет выведено 1302
#quiz #code
Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве.
#include <iostream>
using namespace std;
template <typename T>
struct A {
static_assert(false);
};
int main() {
cout << 1;
}302
#digest
Подборка самых интересных новостей и материалов из мира C++ за последние две недели (4 сентября – 17 сентября 2023)
Читать далее на Хабре
302
#digest
Подборка самых интересных новостей и материалов из мира C++ за последние две недели (21 августа 2023 – 3 сентября 2023)
Читать далее на Хабре
302
Доклады на какие темы вам было бы интересно послушать в следующий раз? Как можно было бы сделать доклады с предыдущей встречи лучше?
Помогите нам стать лучше и сформировать интересную программу для следующей встречи, поделитесь своим мнением через Яндекс.Формы!
302
Записи докладов с прошедшей встречи теперь доступны на нашем канале!
1. Бэкенд на плюсах для нормальных людей — Данил Сидорук — C++ Moscow №0
2. std::expected. Обработка ошибок в C++ 23 — Илья Быконя — C++ Moscow №0
Кроме того, был размещен в публичный доступ репозиторий с кодом к вопросикам, которые были на прошедшей викторине.
А для быстрой навигации по всему этому добру был создан отдельный репозиторий.
302
Спасибо всем, кто посетил наш первый митап оффлайн и всем, кто ждал трансляции! К сожалению, по техническим причинам ее провести не удалось — однако, в течение недели доклады будут перезаписаны и опубликованы в хорошем качестве на нашем канале.
Не всё получилось идеально, но мы не намерены останавливаться на достигнутом. Мы проанализируем допущенные ошибки, чтобы наш второй митап прошел лучше, интереснее и полезнее (и точно с трансляцией 😉).
Ожидайте анонсов!
302
#meetup
Митап стартует уже через три часа и мы ждём всех, кто успел на него зарегистрироваться.
17:30–20:00, Москва, 2-й Донской проезд, д. 9, стр. 3
Все дальнейшие обновления касательно нашей встречи будут публиковаться в комментариях к этому посту.
Так что заходите в наш чат, чтобы ничего не пропустить.
302
#meetup
Наш митап уже завтра! Успейте зарегистрироваться, если хотите посетить встречу оффлайн — до конца регистрации осталось всего несколько часов!
И, вне зависимости от того, будете ли вы завтра на мероприятии оффлайн, давайте познакомимся.
Расскажите о себе и своем плюсовом опыте в комментариях: учитесь вы или работаете, в какой отрасли применяете плюсы на работе и в быту (hardware, game development, developer tools, прикладное ПО) и сколько уже лет вы с ними знакомы...
302
И вот уже пара дней осталась до нашей первой встречи! Напоминаем, что она пройдет 18 августа (Пт) с 17:30 до 20:00 по адресу Москва, 2-й Донской проезд, д. 9, стр. 3 (оффлайн + онлайн трансляция докладов)
Запланированные активности:
1. Бэкенд на плюсах для нормальных людей — доклад
2. std::expected. Обработка ошибок в C++23 — доклад
3. Викторина по мотивам C++ Quiz
4. Кушать снеки и пить напитки, просто хорошо пообщаться и провести время
Если вы планируете посетить мероприятие оффлайн, то вам необходимо зарегистрироваться на него по ссылке, иначе вы не сможете на него попасть.
Как доехать и как дойти до места нашей встречи от станции метро «Ленинский проспект» — по ссылке и на прикрепленной картинке.
Остались вопросы? Пишите в комментарии, на все ответим!
302
До нашей первой встречи осталась всего неделя!
А значит, если вы планируете посетить ее очно, самое время на нее зарегистрироваться 😉
Без регистрации вы не сможете попасть на площадку, а зарегистрировавшись заранее, вы поможете нам: мы сможем точнее прикинуть планируемое количество участников, что для нас очень важно в плане планирования мероприятия.
302
В ряду докладов, запланированных на нашу ближайшую встречу, пополнение :)
Илья Быконя расскажет нам о новом способе обработки ошибок, появившемся в C++23
302
std::expected. Обработка ошибок в C++23
Обработка ошибок в современном C++ представляет целый букет различных инструментов.
С одной стороны, у нас есть тысячи способов получения кодов ошибок (std::errno, out-параметры, просто возвращаемые значения).
С другой — исключения, запрещённые на ряде проектов и накладывающие ограничения на код и оптимизации.
В C++23 в этом наборе случилось пополнение. Нам дали std::expected. Тип, позволяющий совместить производительность кодов ошибок и надёжность исключений.
