C++ Moscow


Гео и язык канала: не указан, не указан
Категория: не указана


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

Связанные каналы  |  Похожие каналы

Гео и язык канала
не указан, не указан
Категория
не указана
Статистика
Фильтр публикаций


Вторая встреча московского сообщества программистов на C++ пройдет 19 ноября (Вс) с 15:20 до 18:00 по адресу Москва, Малый Конюшковский переулок, д. 2 (оффлайн + онлайн трансляция докладов)

Мы приглашаем всех принять в ней участие
: поделиться своим опытом и экспертизой, просто хорошо пообщаться в кругу единомышленников

Кроме того, мы будем рады всем желающим выступить с мини-докладом продолжительностью до двадцати минут на любую тему, связанную с программированием на C++ (заявки принимаются до 15 октября включительно)
Свяжитесь с нами, и мы поможем вам на всех этапах: от подбора темы для выступления (если вы ещё с ней не определились) до подготовки красивой и ясной презентации

Заходите в чат по ссылке, регистрируйтесь на мероприятие (если вы планируете посетить его очно, то регистрация обязательна), и приходите на нашу встречу, будет интересно!




#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


Каким будет результат работы программы выше?
Опрос
  •   123
  •   111
  •   112
  •   Compilation error
30 голосов


#quiz #code

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

#include

using namespace std;

template void f(T) {
static int i = 0;
cout


Работа работой и учеба учебой, но наши организаторы не дремлют и начинают строить более детальные планы на следующий митап..

А каким бы хотели видеть его вы? Поделитесь своими мыслями в комментариях!


#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


Каким будет результат работы программы выше?
Опрос
  •   00
  •   01
  •   11
  •   10
16 голосов


#quiz #code

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

#include
#include

using namespace std;

struct X {
int f() const&&{
return 0;
}
};

int main() {
auto ptr = &X::f;
cout


#proposals #resources

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

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

Какие пропозалы из нее вам кажутся наиболее интересными или каких полезных фич, по вашему мнению, в этом списке не хватает? Присоединяйтесь к обсуждению в комментариях!


#quiz #explanation

В данном коде копирование может произойти лишь в трех местах:
1. std::initializer_list i{c}
2. Первый f(i)
3. Второй f(i)

Так в каких же из них оно происходит? [dcl.init.list] определяет то, как создается std::initializer_list следующим образом:

An object of type std::initializer_list 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 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


Каким будет результат работы программы выше?
Опрос
  •   1
  •   11
  •   111
  •   Compilation error
27 голосов


#quiz #code

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

#include
#include

class C {
public:
C() = default;
C(const C&) { std::cout


#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


Каким будет результат работы программы выше?
Опрос
  •  
  •   1
  •   Compilation error
  •   Undefined behavior
31 голосов


#quiz #code

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

#include

using namespace std;

template
struct A {
static_assert(false);
};

int main() {
cout


#digest

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

Читать далее на Хабре




Доклады на какие темы вам было бы интересно послушать в следующий раз? Как можно было бы сделать доклады с предыдущей встречи лучше?

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


Записи докладов с прошедшей встречи теперь доступны на нашем канале!

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

Кроме того, был размещен в публичный доступ репозиторий с кодом к вопросикам, которые были на прошедшей викторине.
А для быстрой навигации по всему этому добру был создан отдельный репозиторий.

Показано 20 последних публикаций.

96

подписчиков
Статистика канала