C++ Moscow
447 subscribers
6 photos
66 links
Информационный канал московского сообщества программистов на C++

Чат: @cppmoscow_chat
Бот обратной связи: @cppmoscow_bot
Организатор: @eoanermine
Download Telegram
C++ Moscow
И вот уже пара дней осталась до нашей первой встречи! Напоминаем, что она пройдет 18 августа (Пт) с 17:30 до 20:00 по адресу Москва, 2-й Донской проезд, д. 9, стр. 3 (оффлайн + онлайн трансляция докладов) Запланированные активности: 1. Бэкенд на плюсах для…
#meetup

Наш митап уже завтра! Успейте зарегистрироваться, если хотите посетить встречу оффлайн — до конца регистрации осталось всего несколько часов!

И, вне зависимости от того, будете ли вы завтра на мероприятии оффлайн, давайте познакомимся.
Расскажите о себе и своем плюсовом опыте в комментариях: учитесь вы или работаете, в какой отрасли применяете плюсы на работе и в быту (hardware, game development, developer tools, прикладное ПО) и сколько уже лет вы с ними знакомы...
🔥2
C++ Moscow
И вот уже пара дней осталась до нашей первой встречи! Напоминаем, что она пройдет 18 августа (Пт) с 17:30 до 20:00 по адресу Москва, 2-й Донской проезд, д. 9, стр. 3 (оффлайн + онлайн трансляция докладов) Запланированные активности: 1. Бэкенд на плюсах для…
#meetup

Митап стартует уже через три часа
и мы ждём всех, кто успел на него зарегистрироваться.

17:30–20:00, Москва, 2-й Донской проезд, д. 9, стр. 3

Все дальнейшие обновления касательно нашей встречи будут публиковаться в комментариях к этому посту.
Так что заходите в наш чат, чтобы ничего не пропустить.
❤‍🔥1
Спасибо всем, кто посетил наш первый митап оффлайн и всем, кто ждал трансляции! К сожалению, по техническим причинам ее провести не удалось — однако, в течение недели доклады будут перезаписаны и опубликованы в хорошем качестве на нашем канале.

Не всё получилось идеально, но мы не намерены останавливаться на достигнутом. Мы проанализируем допущенные ошибки, чтобы наш второй митап прошел лучше, интереснее и полезнее (и точно с трансляцией 😉).

Ожидайте анонсов!
👍8❤‍🔥1🔥1
Записи докладов с прошедшей встречи теперь доступны на нашем канале!

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

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

Помогите нам стать лучше и сформировать интересную программу для следующей встречи, поделитесь своим мнением через Яндекс.Формы!
👍4❤‍🔥3
#digest

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

Читать далее на Хабре
🔥2❤‍🔥1
#quiz #code

Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве.

#include <iostream>

using namespace std;

template <typename T>
struct A {
static_assert(false);
};

int main() {
cout << 1;
}
👍3
Каким будет результат работы программы выше?
Anonymous Poll
3%
0
45%
1
37%
Compilation error
16%
Undefined behavior
#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
👍3
#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);
}
🔥2
Каким будет результат работы программы выше?
Anonymous Poll
36%
1
24%
11
30%
111
9%
Compilation error
#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
🔥3👏2
#proposals #resources

Каждый месяц комитет по стандартизации C++ (также известный как WG21) публикует свою „переписку“: все предложения (пропозалы) в стандарт за последний месяц, каждое из которых по результатам голосования среди членов WG21 может быть в него включено.

Совсем недавно, например, была опубликована переписка за сентябрь.

Какие пропозалы из нее вам кажутся наиболее интересными или каких полезных фич, по вашему мнению, в этом списке не хватает? Присоединяйтесь к обсуждению в комментариях!
🔥2
#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::*)()>;
}
🔥3
Каким будет результат работы программы выше?
Anonymous Poll
62%
00
29%
01
0%
11
14%
10
#quiz #explanation

Стандарт гласит:

[dcl.fct#8]
The return type, the parameter-type-list, the ref-qualifier, the cv-qualifier-seq, and the exception specification, but not the default arguments, are part of the function type.

То есть, ref-квалификаторы (в нашем случае
const&& для X::f) являются частью типа функции, так что тип ptr это int(X::*)() const&&.

Ответ: 00
👍2
C++ Moscow
Спасибо всем, кто посетил наш первый митап оффлайн и всем, кто ждал трансляции! К сожалению, по техническим причинам ее провести не удалось — однако, в течение недели доклады будут перезаписаны и опубликованы в хорошем качестве на нашем канале. Не всё получилось…
Работа работой и учеба учебой, но наши организаторы не дремлют и начинают строить более детальные планы на следующий митап..

А каким бы хотели видеть его вы? Поделитесь своими мыслями в комментариях!
❤‍🔥5🔥1
#quiz #code

Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве.

#include <iostream>

using namespace std;

template <class T> void f(T) {
static int i = 0;
cout << ++i;
}

int main() {
f(1);
f(1.0);
f(1);
}
👍4
Каким будет результат работы программы выше?
Anonymous Poll
12%
123
10%
111
76%
112
5%
Compilation error
#quiz #explanation

Стандарт гласит:

[temp.fct.spec]
Each function template specialization instantiated from a template has its own copy of any static variable.

То есть, каждое инстанцирование имеет свои копии статических переменных. В нашем коде имеется два инстанцирования: для
T = int и T = double. Так что первый и третий (но не второй) вызов f разделяют между собой одну статическую переменную.

Ответ: 112
👍5