Что приняли в C++17, фотография Бьярне Страуструпа и опрос для C++20

в 15:29, , рубрики: c++, c++ библиотеки, c++17, c++2a, IT-стандарты, standard library, standards, Алгоритмы, Блог компании Яндекс, Компиляторы

Что приняли в C++17, фотография Бьярне Страуструпа и опрос для C++20 - 1
В начале марта в американском городе Кона завершилась встреча международной рабочей группы 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. После чего результат трудов выслали автору предложения, пообщались с ним в кулуарах и… вуаля!

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) — целые числа, где количество машинных слов под хранение числа задаётся на этапе компиляции;
  • ubnbounded 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. Добро пожаловать!

Внимание! Некоторым подгруппам международного комитета С++ нужно получить информацию о том, что разработчикам интересно и чем разработчики пользуются, чтобы лучше расставить свои приоритеты.

Автор: Яндекс

Источник

Поделиться