Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Что сохраняет auto при чтении элемента vector<bool>?
C++20. Что выведет программа?
👾 — 0 0
👍 — 1 1
🥰 — 0 1
⚡️ — Ошибка компиляции
Ответ: 🥰 — 0 1.
snapshot — отдельное значение bool. А auto выводит для proxy тип std::vector<bool>::reference: это объект-посредник, связанный с битом вектора. После изменения flags[0] преобразование proxy в bool даёт true. Вектор не менял размер, поэтому proxy остаётся действительным.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
#include <vector>
int main() {
std::vector<bool> flags{false};
bool snapshot = flags[0];
auto proxy = flags[0];
flags[0] = true;
std::cout << snapshot << ' '
<< static_cast<bool>(proxy);
}
👾 — 0 0
👍 — 1 1
🥰 — 0 1
⚡️ — Ошибка компиляции
snapshot — отдельное значение bool. А auto выводит для proxy тип std::vector<bool>::reference: это объект-посредник, связанный с битом вектора. После изменения flags[0] преобразование proxy в bool даёт true. Вектор не менял размер, поэтому proxy остаётся действительным.
Библиотека задач по C++
👾6🥰4
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽
Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.
Please open Telegram to view this post
VIEW IN TELEGRAM
Какое значение по умолчанию получит виртуальный метод?
C++20. Что выведет программа?
👾 — Derived 1
👍 — Derived 2
🥰 — Base 1
⚡️ — Ошибка компиляции
Ответ: 👾 — Derived 1.
Виртуальный вызов выбирает реализацию Derived::show. Но аргумент по умолчанию берётся из объявления, доступного через статический тип ref — Base&. Поэтому вызывается Derived::show(1).
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
struct Base {
virtual void show(int n = 1) {
std::cout << "Base " << n;
}
};
struct Derived : Base {
void show(int n = 2) override {
std::cout << "Derived " << n;
}
};
int main() {
Derived object;
Base& ref = object;
ref.show();
}
👾 — Derived 1
👍 — Derived 2
🥰 — Base 1
⚡️ — Ошибка компиляции
Виртуальный вызов выбирает реализацию Derived::show. Но аргумент по умолчанию берётся из объявления, доступного через статический тип ref — Base&. Поэтому вызывается Derived::show(1).
Библиотека задач по C++
👾9
Разделяют ли копии mutable-лямбды один счётчик?
C++20. Что выведет программа?
👾 — 1 2 3
👍 — 1 1 1
🥰 — Ошибка компиляции
⚡️ — 1 2 1
Ответ: ⚡️ — 1 2 1.
Захваченный по значению n хранится внутри объекта лямбды. При копировании next создаётся другой объект со своим n, пока равным нулю. mutable разрешает менять этот внутренний счётчик, но не объединяет состояние копий.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
int main() {
auto next = [n = 0]() mutable {
return ++n;
};
auto copy = next;
std::cout << next() << ' ';
std::cout << next() << ' ';
std::cout << copy();
}
👾 — 1 2 3
👍 — 1 1 1
🥰 — Ошибка компиляции
⚡️ — 1 2 1
Захваченный по значению n хранится внутри объекта лямбды. При копировании next создаётся другой объект со своим n, пока равным нулю. mutable разрешает менять этот внутренний счётчик, но не объединяет состояние копий.
Библиотека задач по C++
⚡3👾3
Изменится ли размер map после чтения отсутствующего ключа?
C++20. Что выведет программа?
👾 — 0 0
👍 — 0 1
🥰 — std::out_of_range
⚡️ — Ошибка компиляции
Ответ: 👍 — 0 1.
Если ключ отсутствует, operator[] вставляет новый элемент. Для int со стандартным аллокатором значение инициализируется нулём. Поэтому value равен 0, а в map теперь один элемент. Для поиска без вставки можно использовать find; at для отсутствующего ключа выбросил бы исключение.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> counts;
int value = counts["go"];
std::cout << value << ' '
<< counts.size();
}
👾 — 0 0
👍 — 0 1
🥰 — std::out_of_range
⚡️ — Ошибка компиляции
Если ключ отсутствует, operator[] вставляет новый элемент. Для int со стандартным аллокатором значение инициализируется нулём. Поэтому value равен 0, а в map теперь один элемент. Для поиска без вставки можно использовать find; at для отсутствующего ключа выбросил бы исключение.
Библиотека задач по C++
👍6🥰1
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой конструктор вызовет std::move для const-объекта?
C++20. Что выведет программа?
👾 — move
👍 — Ошибка компиляции
🥰 — copy
⚡️ — Ничего: сработает устранение копирования
Ответ: 🥰 — copy.
std::move не снимает const: здесь результат имеет тип const Item&&. Его нельзя передать конструктору Item(Item&&), зато конструктор Item(const Item&) подходит. Поэтому создаётся копия. Сам std::move не выполняет перемещение.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
#include <utility>
struct Item {
Item() = default;
Item(const Item&) {
std::cout << "copy";
}
Item(Item&&) {
std::cout << "move";
}
};
int main() {
const Item source;
Item target = std::move(source);
}
👾 — move
👍 — Ошибка компиляции
🥰 — copy
⚡️ — Ничего: сработает устранение копирования
std::move не снимает const: здесь результат имеет тип const Item&&. Его нельзя передать конструктору Item(Item&&), зато конструктор Item(const Item&) подходит. Поэтому создаётся копия. Сам std::move не выполняет перемещение.
Библиотека задач по C++
🥰5
Узнает ли std::size размер массива в параметре функции?
C++20. Скомпилируется ли программа и что выведет?
👾 — Ошибка компиляции
👍 — 4
🥰 — Размер указателя в байтах
⚡️ — 0
Ответ: 👾 — Ошибка компиляции.
В объявлении параметра функции int values[4] корректируется до int* values. Число 4 не делает параметр массивом из четырёх элементов. std::size не умеет узнавать длину по обычному указателю. Чтобы сохранить размер, можно принять массив по ссылке или использовать std::span и его size().
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Скомпилируется ли программа и что выведет?
#include <iostream>
#include <iterator>
void printSize(int values[4]) {
std::cout << std::size(values);
}
int main() {
int values[4]{1, 2, 3, 4};
printSize(values);
}
👾 — Ошибка компиляции
👍 — 4
🥰 — Размер указателя в байтах
⚡️ — 0
В объявлении параметра функции int values[4] корректируется до int* values. Число 4 не делает параметр массивом из четырёх элементов. std::size не умеет узнавать длину по обычному указателю. Чтобы сохранить размер, можно принять массив по ссылке или использовать std::span и его size().
Библиотека задач по C++
🥰3👾2👍1
Сколько элементов создадут круглые и фигурные скобки?
C++20. Что выведет код?
👾 — 3 3
👍 — 3 2
🥰 — 2 2
⚡️ — 7 2
Ответ: 👍 — 3 2.
Круглые скобки выбирают конструктор «количество и значение»: три семёрки. Фигурные скобки выбирают конструктор с initializer_list: два элемента, 3 и 7.
Документация: выбор конструктора при инициализации списком
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <vector>
int main() {
std::vector<int> first(3, 7);
std::vector<int> second{3, 7};
std::cout << first.size() << ' '
<< second.size();
}
👾 — 3 3
👍 — 3 2
🥰 — 2 2
⚡️ — 7 2
Круглые скобки выбирают конструктор «количество и значение»: три семёрки. Фигурные скобки выбирают конструктор с initializer_list: два элемента, 3 и 7.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Что меняют дополнительные скобки в decltype?
C++20. Что выведет код?
👾 — 1 2
👍 — 3 3
🥰 — 3 2
⚡️ — Ошибка компиляции
Ответ: 🥰 — 3 2.
Для имени переменной decltype(n) даёт её объявленный тип — int. Выражение (n) — lvalue, поэтому decltype((n)) даёт int&. Переменная second ссылается на n и меняет его.
Документация: определение типа через decltype
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
int main() {
int n = 1;
decltype(n) first = n;
decltype((n)) second = n;
first = 2;
second = 3;
std::cout << n << ' ' << first;
}
👾 — 1 2
👍 — 3 3
🥰 — 3 2
⚡️ — Ошибка компиляции
Для имени переменной decltype(n) даёт её объявленный тип — int. Выражение (n) — lvalue, поэтому decltype((n)) даёт int&. Переменная second ссылается на n и меняет его.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3⚡1👍1
Удалит ли release() объект?
C++20. Что выведет код?
👾 — D0
👍 — 1 D
🥰 — Только 0
⚡️ — 0 D
Ответ: ⚡️ — 0 D.
Метод release() возвращает указатель и снимает владение. Сам объект остаётся жив. owner уже пуст, поэтому печатается 0. Деструктор вызывается позже, при delete raw.
Документация: unique_ptr::release
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <memory>
struct Item {
~Item() { std::cout << "D"; }
};
int main() {
auto owner = std::make_unique<Item>();
auto raw = owner.release();
std::cout << bool(owner) << ' ';
delete raw;
}
👾 — D0
👍 — 1 D
🥰 — Только 0
⚡️ — 0 D
Метод release() возвращает указатель и снимает владение. Сам объект остаётся жив. owner уже пуст, поэтому печатается 0. Деструктор вызывается позже, при delete raw.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡10👾2
Останется ли поле живым после reset() владельца?
C++20. Что выведет код?
👾 — 7 1
👍 — 7 0
🥰 — 0 1
⚡️ — Неопределённое поведение
Ответ: 👾 — 7 1.
Указатель part хранит адрес поля, но разделяет владение всем объектом Data. После owner.reset() остаётся один владелец — part. Поэтому объект и его поле продолжают жить.
Документация: aliasing-конструктор shared_ptr
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <memory>
struct Data {
int value = 7;
};
int main() {
auto owner = std::make_shared<Data>();
std::shared_ptr<int> part(owner, &owner->value);
owner.reset();
std::cout << *part << ' '
<< part.use_count();
}
👾 — 7 1
👍 — 7 0
🥰 — 0 1
⚡️ — Неопределённое поведение
Указатель part хранит адрес поля, но разделяет владение всем объектом Data. После owner.reset() остаётся один владелец — part. Поэтому объект и его поле продолжают жить.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾3
Почему accumulate теряет дробную часть?
C++20. Что выведет код?
👾 — 4 4
👍 — 3 4
🥰 — 3 3
⚡️ — 0 4
Ответ: 👍 — 3 4.
Начальное значение задаёт тип аккумулятора. С 0 это int: после каждого сложения результат преобразуется в целое число. Получаются сначала 1, затем 3. С 0.0 аккумулятор имеет тип double, и сумма равна 4.
Документация: std::accumulate
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector<double> values{1.5, 2.5};
auto first = std::accumulate(
values.begin(), values.end(), 0
);
auto second = std::accumulate(
values.begin(), values.end(), 0.0
);
std::cout << first << ' ' << second;
}
👾 — 4 4
👍 — 3 4
🥰 — 3 3
⚡️ — 0 4
Начальное значение задаёт тип аккумулятора. С 0 это int: после каждого сложения результат преобразуется в целое число. Получаются сначала 1, затем 3. С 0.0 аккумулятор имеет тип double, и сумма равна 4.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Сохранится ли поведение наследника после копирования в базовый класс?
C++20. Что выведет код?
👾 — DD
👍 — BB
🥰 — BD
⚡️ — Ошибка компиляции
Ответ: 🥰 — BD.
Переменная copy — отдельный объект Base. При копировании часть Derived отсекается, поэтому вызывается Base::show. Ссылка ref по-прежнему обращается к исходному объекту Derived, и виртуальный вызов выбирает его метод.
Документация: копирование объектов классов
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
struct Base {
virtual void show() const {
std::cout << "B";
}
};
struct Derived : Base {
void show() const override {
std::cout << "D";
}
};
int main() {
Derived original;
Base copy = original;
Base& ref = original;
copy.show();
ref.show();
}
👾 — DD
👍 — BB
🥰 — BD
⚡️ — Ошибка компиляции
Переменная copy — отдельный объект Base. При копировании часть Derived отсекается, поэтому вызывается Base::show. Ссылка ref по-прежнему обращается к исходному объекту Derived, и виртуальный вызов выбирает его метод.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6
Сколько символов сохранит строка со встроенным \0?
C++20. Что выведет код?
👾 — 3 3
👍 — 1 1
🥰 — 4 3
⚡️ — 1 3
Ответ: ⚡️ — 1 3.
Первый конструктор читает C-строку до первого нулевого символа и сохраняет только A. Во втором длина указана явно: он копирует три символа, включая внутренний \0. Для std::string этот символ может быть частью содержимого.
Документация: конструкторы std::string
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <string>
int main() {
std::string first = "A\0B";
std::string second("A\0B", 3);
std::cout << first.size() << ' '
<< second.size();
}
👾 — 3 3
👍 — 1 1
🥰 — 4 3
⚡️ — 1 3
Первый конструктор читает C-строку до первого нулевого символа и сохраняет только A. Во втором длина указана явно: он копирует три символа, включая внутренний \0. Для std::string этот символ может быть частью содержимого.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6
Какая распаковка изменит исходную пару?
C++20. Что выведет код?
👾 — 7 5
👍 — 1 5
🥰 — 5 5
⚡️ — 7 7
Ответ: 👾 — 7 5.
Объявление с auto создаёт скрытую копию пары: x связан с её первым элементом. Объявление с auto& связывается с исходной парой. Поэтому запись в a меняет values.first, а x сохраняет значение 5.
Документация: структурные связывания
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <utility>
int main() {
std::pair<int, int> values{1, 2};
auto [x, y] = values;
auto& [a, b] = values;
x = 5;
a = 7;
std::cout << values.first << ' ' << x;
}
👾 — 7 5
👍 — 1 5
🥰 — 5 5
⚡️ — 7 7
Объявление с auto создаёт скрытую копию пары: x связан с её первым элементом. Объявление с auto& связывается с исходной парой. Поэтому запись в a меняет values.first, а x сохраняет значение 5.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾5
C++20. Что выведет код?
#include <iostream>
#include <optional>
int main() {
std::optional<bool> flag = false;
std::cout << (flag ? "yes" : "no") << ' '
<< std::boolalpha << *flag;
}
👾 — no false
👍 — yes false
🥰 — yes true
⚡️ — Ошибка компиляции
В условии optional проверяет, содержит ли он значение. Здесь значение есть, поэтому выбирается yes. Само хранимое значение равно false.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
C++20. Что выведет код?
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> values{1, 2, 2, 3};
auto end = std::remove(values.begin(), values.end(), 2);
std::cout << values.size() << ' '
<< std::distance(values.begin(), end) << ' ';
values.erase(end, values.end());
std::cout << values.size();
}
👾 — 2 2 2
👍 — 4 4 2
🥰 — 4 2 4
⚡️ — 4 2 2
std::remove перемещает сохраняемые элементы в начало диапазона и возвращает его новый логический конец. Размер vector остаётся равным 4. В сохраняемой части два элемента; после erase физический размер тоже становится равным 2.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡2❤1
C++20. Что выведет код?
#include <iostream>
#include <map>
int main() {
int calls = 0;
auto build = [&] { ++calls; return 99; };
std::map<int, int> values{{1, 7}};
auto [it, inserted] = values.try_emplace(1, build());
std::cout << calls << ' ' << std::boolalpha
<< inserted << ' ' << it->second;
}
👾 — 1 false 7
👍 — 0 false 7
🥰 — 1 true 99
⚡️ — 0 true 99
build() вычисляется до входа в try_emplace, поэтому calls становится равным 1. Ключ 1 уже есть: вставка не выполняется, а значение 7 сохраняется.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
C++20. Что выведет код?
#include <iostream>
#include <memory>
#include <utility>
int main() {
auto ptr = std::make_unique<int>(7);
auto read = [p = std::move(ptr)] { return *p; };
std::cout << std::boolalpha << (ptr == nullptr)
<< ' ' << read();
}
👾 — false 7
👍 — Ошибка компиляции
🥰 — true 7
⚡️ — true 0
Инициализирующий захват перемещает unique_ptr в поле объекта-замыкания. Исходный ptr становится пустым, а лямбда владеет объектом и возвращает хранимую семёрку.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰7❤1