![](https://habrastorage.org/files/cf4/438/f8e/cf4438f8e1bb4b0197448ee1578ce9e3.png)
В начале марта в американском городе Кона завершилась встреча международной рабочей группы WG21 по стандартизации C++ в которой участвовали сотрудники Яндекса.
C++17 "приняли"!
Если быть совсем точным, решили, что пора передавать документ-черновик С++17 в вышестоящий орган ISO, который выпустит его в качестве стандарта, либо отправит обратно для исправления форматирования и некоторых других формальностей.
Заседания, как обычно, занимали целый день плюс дополнительно заседала подгруппа по работе с числами.
Основное время было посвящено полировке черновика C++17, но несколько небольших и интересных нововведений все же успели проскочить в C++17.
20 лет ждали...
std::ofstream(L"Теперь можно открывать файлы с юникодными именами.txt") << u8"Ура!";
std::optional и сравнения
Операторы сравнения для класса std::optional до последнего дня были описаны как:
template <class T>
bool operator < (const optional<T>&, const T&);
// ...
Что вызывало ошибки компиляции в ряде случаев:
optional<const int> x = 42;
int y = 666;
x == y; // не скомпилируется
...
optional<string> s = "Hello";
s == "Hello"; // не скомпилируется
В Коне эта проблема была исправлена, операторы сравнения приобрели следующий вид:
template <class T, class U>
bool operator < (const optional<T>&, const U&);
// ...
Так что теперь все вышеприведённые примеры будут компилироваться, а сравнение 's == «Hello»' будет работать без создания временного объекта строки.
Deduction guides
Было добавлено множество явных deduction guides, так что теперь следующий код будет собираться:
// Ура! Можно не писать шаблонные параметры.
std::tuple a = {42, "Hello", 3.14};
std::array b = {1, 2, 3, 4, 5, 6, 7, 8};
std::pair c = {42, "Hello"};
std::function d = [](int i) { std::cout << i; };
std::set e = {1, 2, 3, 4, 5, 6, 7, 8};
// P.S.: В примерах выше знак '=' тоже можно не писать :)
История успеха std::array
В первоначальной бумаге по интеграции explicit deduction guides в стандартную библиотеку не присутствовал класс std::array.
Но так как этот класс любимый у одного из представителей России в WG21 C++, то мы закатали рукава, вооружились последними компиляторами, написали и оттестировали explicit deduction guides для std::array. После чего результат трудов выслали автору предложения, пообщались с ним в кулуарах и… вуаля!
Но так как этот класс любимый у одного из представителей России в WG21 C++, то мы закатали рукава, вооружились последними компиляторами, написали и оттестировали explicit deduction guides для std::array. После чего результат трудов выслали автору предложения, пообщались с ним в кулуарах и… вуаля!
std::byte
Кого-нибудь смущало, что когда нам нужен массив байт для хранения каких-то бинарных данных у мы заводили «массив беззнаковых букв»? C С++17 у нас будет тип данных std::byte и теперь вместо
unsigned char raw_buffer[buffer_size];
можно писать std::byte raw_buffer[buffer_size];
.Мелочи, делающие код компактнее и портабельнее
Множество небольших улучшений было внесено повсеместно в стандарт. Так например:
- std::filesystem::path был подкручен для того, чтобы он мог корректно работать на платформах, отличных от Windows и POSIX (например, на zOS).
- std::filesystem::directory_entry научился кешировать информацию от ОС и обходиться одним системным вызовом там, где раньше требовалось 2.
- std::hash для большинства случаев теперь помечен как noexcept, что сделает размер ваших бинарников меньше (при условии, что вы пользуетесь unordered_* контейнерами).
- Текст описывающий std::atomic_* функции был сильно переработан, теперь код
гарантированно работает на всех имплементациях.long example(atomic<long> * a) { return atomic_fetch_add(a, 42); }
- Все переменные-теги и шаблонные переменные были помечены как inline, что устраняет проблемы с потенциальным нарушением ODR. Другими словами, объём и производительность вашего код будут менее зависимы от линкера, работа линкера упростится.
Обсуждения и идеи
Как всегда, несколько подгрупп внутри комитета С++ работали одновременно. Некоторые подгруппы успели разобраться с задачами связанными с C++17, и приступили к продумыванию идей для C++20. Ниже расскажу о некоторых самых интересных обсуждениях.
Numbers TS
Если вы занимаетесь точными науками, разрабатываете сверхнадёжные приложения, участвуете в олимпиадах по программированию, ведете финансовые рассчёты или работаете с огромными числами, то у меня есть для вас хорошие новости. Сформировались планы по выпуску Numbers TS — набора различных классов для разнообразнейшей работы с числами. Вот некоторые кандидаты:
- wide float — числа с плавающей точкой, где количество машинных слов под хранение числа задаётся на этапе компиляции;
- wide integers (на основе предложения с stdcpp.ru) — целые числа, где количество машинных слов под хранение числа задаётся на этапе компиляции;
- unbounded floats — числа с плавающей точкой, способные хранить число любой размерности и динамически аллоцирующие память по мере необходимости;
- unbounded integers — целые числа, способные хранить число любой размерности и динамически аллоцирующие память по мере необходимости;
- rational — дробные числа;
- safe numbers — обертки над числами, гарантирующие отсутствие UB на этапе компиляции, либо проверяющие переполнения и UB на рантайме;
- decimal;
- small float.
Планы амбициозные, ждать придётся достаточно долго.
operator<=>()
Обсудили operator<=>(). Решено продолжать проработку этого оператора, есть все шансы что к C++20 можно будет писать:
struct foo { /* очень много различных полей */ };
auto operator<=>(const foo&, const foo&) = default; // Сгенерирует все компараторы для сравнения foo c foo
auto operator<=>(const foo&, const char*) = default; // Сгенерирует все компараторы для сравнения foo c const char* и все компараторы для сравнения const char* с foo
Остальное
А еще обсуждали модули, корутины/сопрограммы/«Гор-рутины», контракты, constexpr и constexpr контейнеры, constexpr аллокацию «в куче», плагины и динамическую загрузку библиотек, крутые оптимизации для стандартных контейнеров и много другое. Рассказать всё в одном посте не получится, поэтому мы в РГ 21 планируем небольшую встречу, на которой расскажем о будущем С++ и о С++17 поподробнее. Так же на встрече будет выступать Гор Нишанов — автор корутин для WG21 C++.
Итоги и опрос
C++17 на подходе, ура!
Если у вас есть идеи для C++20, вы нашли проблемы в C++17/C++14/C++11, или просто хотите подстегнуть разработку той или иной фичи C++, то заходите на сайт рабочей группы stdcpp.ru. Добро пожаловать!
Внимание! Некоторым подгруппам международного комитета С++ нужно получить информацию о том, что разработчикам интересно и чем разработчики пользуются, чтобы лучше расставить свои приоритеты.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Итак, вот мини опрос:
51.05% Можно научить контейнеры доставать информацию о действительном размере выделенного куска памяти из аллокатора, что сделает контейнеры стандартной библиотеки более производительными и менее затратными по памяти (например в тесте вот тут получили 15% прирост производительности при вставке в вектор). Вам эта разработка интересна?195
40.84% Используете ли вы в компании, или в своих личных проектах, плагины/динамическую-загрузку-библиотек? Опишите в комментариях, какими функциями и классами вы для этого пользуетесь?156
14.14% Используете ли вы в компании, или в своих личных проектах, классы способные хранить числа произвольной длинны (unbounded integers) с нестандартными аллокаторами?54
6.28% Применяете ли вы один нестандартный аллокатор для всего бинарника целиком (вместо использования специфичного аллокатор именно для unbounded integers)?24
2.36% Переопределяете ли вы в аллокаторе для unbounded integers тип pointer на имитирующий поведение указателя класс?9
67.8% Вам нужны модули, не экспоритрующие макросы и максимально быстрые при компиляции?259
38.48% Вам нужны модули, экспоритрующие макросы и позволяющие с большей лёгкостью переносить старый код на модули?147
Проголосовали 382 пользователя. Воздержались 274 пользователя.