Rvalue-references (2 пары)
- Копирование объектов при возврате из функции
- Return value optimization (RVO)
- Named return value optimization (NRVO)
- Копирование объектов при получении параметра функции по значению
- Понятие lvalue и rvalue
- Value category у аргумента и у результата у встроенных операторов (=, +=, +, ++, &, *)
- Проблема хранения в контейнерах non-copyable объектов и объектов с дорогим копированием
- Rvalue-references
- Соглашения по использованию rvalue-references, move-семантика
std::move
- новое поведение
std::swap
- тонкость с реализацией move-присваивание через swap, поскольку swap реализован через move
- требования на move-присваивание от
*this
- rvalue references for *this
- noexcept
- xvalue/prvalue, продление времени жизни при бинде к rvalue-ссылке
- сравнение с destructive move
Perfect-forwarding (2 пары)
- Проблема perfect-fowarding
- Вывод параметров шаблона при использовании rvalue-ссылок
- Reference-collapsing rule
std::forward
- Variadic templates
- expand сразу двух pack’ов
- для template template параметров http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf
- Примеры использования perfect forwarding:
emplace
, emplace_{front,back}
, make_{unique,shared,tuple}
- Возврат результата в при perfect-fowarding
- decltype
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf
std::declval
- Правила поиска имен, trailing return type
nullptr
Вывод типов и анонимные функции (1 пара)
- auto
- вывод типа в случае наличия нескольких деклараторов
- вывод при наличии ptr/ref деклараторов
- вывод с rvalue-ссылками
- различия вывода auto и параметра шаблона
decltype(auto)
(C++14)
- Анонимные функции
- Local and unnamed types as template arguments
- Capture список в анонимных функциях
- Generalized lambda capture C++14
- проблема захвата this, в конструкторе, если параметр и
член-данных называются одинаково
- Свойства анонимных функций
- копируемость
- присваиваемость
- move-амость
- конверсия в указатель на функцию
- Вывод типа возвращаемого значения в лямбдах и в обычных функциях C++14
- в темплейтных функциях
- упомянуть про SFINAE
Паттерн type-erasure, runtime и compile-time полиморфизм (1 пара)
std::function
any_iterator
any_range
std::any
(C++17)
- Boost.TypeErasure
std::mem_fn
- http://cplusplus.github.io/LWG/lwg-defects.html#2048
std::bind
- полезность при необходимости скопировать захватываемые данные
- Runtime и compile-time полиморфизм
Small-object optimization and misc vocabulary types (1 пара)
- Small-object optimization
- для
std::string
- для
std::function
- Copy-on-write optimization
std::optional
(С++17)
! включить сюда рассуждения про важность сохранения инварианта класса
и как хорошо, когда часть инварианта можно закодировать в типе
- Unrestricted unions
std::aligned_storage
- Управление выравниванием (alignof, alignas)
std::variant
(C++17)
std::tuple
- сравнение tuple со структурами
- structured binding (C++17)
- изменение value-category при return переменных при structured binding’е
Всякие полезности при написании классов (1 пара)
- Explicit override control, final classes
- указать, что это context-sensitive keyword
- Defaulted and deleted functions
- для конструкторов
- пример с
std::ref
/std::cref
- Delegating constructors
- уточнение когда вызывается деструктор
- Inheriting constructors
- разные правила для C++11 и C++17
- Explicit conversion operators
- Extended friend declarations
- Non-static data member initializers
- Defining move special member functions
- Strongly-typed enums
- Forward declarations for enums
- Inline namespaces
- Nested namespace definition
Умные указатели (1 пара)
unique_ptr
shared_ptr
- custom deleter
- shared_ptr на члены-класса
- внутреннее устройство
shared_ptr
std::make_shared
weak_ptr
- замечание о том, что
weak_ptr::expired
racy и надо использовать weak_ptr::lock
- pitfall: private inheritance from
std::enable_shared_for_this
- *_pointer_cast
- pimpl используя
unique_ptr
и shared_ptr
- Решаемые задачи
- инициализация контейнеров так же кратно как встроенных массивов – initializer lists
- инициализация POD-структур как в С – aggregate initialization
- designated initializers (C++2a)
- неоднозначность грамматики: function declaration / direct initialization
- Инициализация контейнеров
- разный результат для
vector(1, 2)
и vector{1, 2}
- Инициализация POD-структур
- не работает с forwarding-функциями (emplace, make, …)
- Использование {} для инициализации
vector<string> ss aba
- Нетривиальное взаимодействие с
auto
- Template type aliases
- Template variables
- Самый эффективный в смысле compilation time способ отсечься по SFINAE – default template arguments, теперь и для function templates
- Static assertions
- Expression SFINAE
- Std type traits
- Constexpr functions
- Разница с точки зрения компилятора между вычислением constexpr functions и variables – значения последних кэшируются
- Пример использования – вычисление аргумента
noexcept
- Бонусы
std::void_t
if constexpr
- fold expressions
- Явное инстанцирование темплейтов и подавление инстанцирования
Расширения стандартной библиотеки (2 пары)
- emplace и move semantics везде, даже в std::pair
- transparent comparator и heterogeneous lookup
- std::filesystem – вот есть такой, очень кратко
- std::chrono – вот есть такой, очень кратко + UDL (стандартные и как писать свои)
string_view
- конструирование от temporary string
- view на смуванную small-строку
- забавный курьез: из перегрузок
foo(bool)
и foo(string_view)
при вызове foo("aba")
выберется первая, решение – foo("aba"sv)
- unordered containers и специализация
std::hash
для своей структуры
- согласованность с
operator ==
- пессимизация из-за забытого
noexcept
- Внешнии функции в интерфейсе контейнера
std::begin
std::end
std::size
- Range-based for loop
auto &&
- проблема итерации по контейнеру без &
- Ranges
- не владеющие типы
reference_wrapper
, string_view
- когда передавать параметры функции по ссылке, а когда по значению
- реализуем vector::emplace_back
- реализуем vector::insert(range)
- реализуем range adaptor правильно (как в range-v3, а не как в boost.range)
Undefined behavior (1 пара)
- Пример с sum
- Пример с memcpy
- Ключевое слово restrict
- Понятие undefined behavior
- Виды undefined behavior
- для целых чисел
- для указателей
- strict aliasing rule
- Sanitizers
- Fuzz-testing
- Уровни fuzzing’а
- Mutation-based fuzzing
- Control-flow guided (coverage-based) fuzzing
- aflfuzz
- LLVMFuzzer