
В этот раз прорабатывались следующие большие темы:
- std::hive
- Constexpr, ещё больше constexpr
- Безопасность, контракты, hardening, профили, UB и std::launder
- Relocate
- #embed
Эксперт-разработчик C++
Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатывает userver — современный опенсорсный асинхронный фреймворк с богатым набором абстракций для быстрого и комфортного создания микросервисов, сервисов и утилит на C++.
Когда мы пишем какой‑то код для userver и для таких сложных проектов, как Boost, периодически мы сталкиваемся с нестандартными проблемами. И эти нестандартные проблемы требуют нестандартных решений. Вот о таких решениях мы сегодня и поговорим.
А именно:
— Посмотрим, как работают исключения на платформе Linux x86, и сделаем с ними что‑то интересное.
— Залезем ещё глубже под капот исключений и сделаем их ещё быстрее.
— Сделаем висячую ссылку на невалидный объект, и всё будет хорошо.
— А под конец то, что все любим, — погрузимся в шаблонное метапрограммирование.
install
, докер-образами, Yandex Cloud-образом и DEB-пакетами;[[indeterminate]]
и уменьшение количества Undefined Behavior,=delete;
,...[42]
,assert(...)
,static_assert
,_
,std::to_string
,native_handle()
,*function*
,constexpr
,std::submdspan
,static operator[]
;static constexpr
в constexpr
-функциях;std::print
с другими консольными выводами;std::expected
;static_assert(false)
и прочее.std::get
и std::tuple_size
для агрегатов;#embed
;std::stacktrace
из исключений;std::mdspan
std::flat_map
std::flat_set
std::print("Hello {}", "world")
constexpr
для bitset
, to_chars/from_chars
std::string::substr() &&
import std;
std::start_lifetime_as
static operator()
[[assume(x > 0)]];
std::generator
std::expected
— новый механизм сообщения об ошибках без использования исключений и без недостатков кодов возврата.std::ranges::to
— результаты работы алгоритмов можно легко превратить в контейнер.std::views::join_with
— добавление разделителя между элементами.void naive_accept() {
for (;;) {
auto new_socket = accept(listener);
std::thread thrd([socket = std::move(new_socket)] {
auto data = socket.receive();
process(data);
socket.send(data);
});
thrd.detach();
}
}
operator[](int, int, int)
std::optional
std::move_only_function
std::basic_string::resize_and_overwrite
std::views::zip
и zip_transform
, adjacent
, adjacent_transform
std::to_underlying()
— функцию, преобразовывающую значение enum к нижележащему целочисленному типу:enum class ABCD : std::uint64_t { A = 0x1012, B = 0x405324, };
constexpr std::uint64_t value = std::to_underlying(ABCD::A);