Еще Один Шаг К C++20. Встреча В Альбукерке

От Центральная часть Канада на юго-западе США! Альбукерке находится в Нью-Мексико:

Еще один шаг к C++20. Встреча в Альбукерке

На заседании Международного комитета по стандартизации C++, которое проходило в этом городе, было принято одно очень большое нововведение в C++20 и несколько мелких.



оператор <=>

В черновом варианте C++20 добавлен оператор космического корабля, который позволяет определять взаимосвязь элементов за одну операцию.

В простых случаях это означает, что вы можете определить оператора космического корабля и ваш класс научится сравнивать любым способом: <, > , <=, > =, == и !=.

Пример:

Без оператора космического корабля С оператором космического корабля
  
  
  
  
  
  
  
  
  
   

struct point3d { int x; int y; int z; }; using p_ref = const point3d&; bool operator==(p_ref a, p_ref b) { return a.x == b.x && a.y == b.y && a.z == b.z ; } bool operator< (p_ref a, p_ref b) { return a.x < b.x || (a.x == b.x && a.y < b.y) || (a.x == b.x && a.y == b.y && a.z < b.z) ; } bool operator!=(p_ref a, p_ref b) { return !(a == b); } bool operator<=(p_ref a, p_ref b) { return !(b < a); } bool operator> (p_ref a, p_ref b) { return b < a; } bool operator>=(p_ref a, p_ref b) { return !(a < b); }



struct point3d { int x; int y; int z; auto operator<=>(const point3d&) const = default; };

Поведение оператора можно настроить по типу возвращаемого значения:

class weak_equality; class strong_equality; class partial_ordering; class weak_ordering; class strong_ordering;

Кроме того, вы можете написать тело самого оператора, если вам нужно какое-то особое поведение:

#include <compare> // weak_ordering, is_neq struct point3d { int x; int y; int z; std::weak_ordering operator<=>(const point3d& p) const { using std::abs; if (auto cmp = abs(z) <=> abs(p.z); std::is_neq(cmp)) return cmp; if (auto cmp = abs(x) <=> abs(p.x); std::is_neq(cmp)) return cmp; return abs(y) <=> abs(p.y); } };

Описание поведения оператора и примеры использования можно найти в этом документе .

Описана интеграция космического корабля со стандартной библиотекой.

Здесь *.

Особенно приятно видеть, что добавлен следующий алгоритм:

lexicographical_compare_3way(InputIterator1 b1, InputIterator1 e1, InputIterator2 b2, InputIterator2 e2);

Теперь вы можете эффективно сравнивать диапазоны данных за один проход.

osyncstream

Многие из читателей, вероятно, писали в std::cout/std::cerr одновременно из нескольких потоков и видели странный результат:

#include <iostream> #include <thread> #include <string_view> void say_hello(std::string_view username) { std::cerr << "Hello " << username; } void beware_of(std::string_view something) { std::cerr << something << " is dangerous"; } int main() { std::thread t1([]{ say_hello("Rachel"); }); std::thread t2([]{ beware_of("darkness"); }); std::cerr << '\n'; t2.join(); t1.join(); /* Possible output: Hello darkness Rachel is dangerous */ }

Итак, в C++20 были добавлены классы, которые позволяют легко и без лишних накладных расходов избежать смешивания выходных данных:

#include <iostream> #include <thread> #include <string_view> void say_hello(std::string_view username) { std::osyncstream{std::cerr} << "Hello " << username; } void beware_of(std::string_view something) { std::osyncstream(std::cerr) << something << " is dangerous"; } int main() { std::thread t1([]{ say_hello("Rachel"); }); std::thread t2([]{ beware_of("darkness"); }); std::cerr << '\n'; t2.join(); t1.join(); }

Подробности - в Эта бумага *.



Достоинства РГ21

Как всегда, мы пошли на встречу с несколькими предложениями:
  • P0539R2 — целые числа, размер (количество байт) которых задается на этапе компиляции.

    В интерфейсе решили использовать бита, посоветовали разбить статью на несколько статей поменьше, обсудили исключения и прочие мелочи.

    Предложение необходимо обновить.

  • P0415R0 * — constexpr для std::complex. Мы внедрили его в C++20 и тут же пометили еще пару функций как constexpr.
  • P0202R2 * - constexpr для большинства алгоритмов в .

    Статья была разделена на две части, и часть, посвященная алгоритмам, не использующим std::swap, была принята в C++20. Оставшаяся часть будет принята на следующих заседаниях, будет отдельное предложение.

  • P0275R2 — Shared_library или классы, необходимые для динамической загрузки библиотек.

    Мы рассмотрели это в группе «Эволюция» и решили, что статья затрагивает только стандартную библиотеку и допустимо оставить поведение плагинов неопределенным.

    Дальнейшая работа будет проводиться в группе «Эволюция библиотек» на будущих встречах.

  • P0858R0 (пока не в открытом доступе) - эта статья была написана прямо во время встречи в Альбукерке.

    Статья позволяет работать с итераторами std::basic_string_view и std::array в контекстах constexpr. На следующей встрече они собираются принять C++20.

Кроме того, нас попросили представить комитету два предложения, которые мы не писали напрямую:
  • P0457R1 — Begins_with и Ends_with для строк.

    Принят в C++20. Качественный товар!

  • P0458R0 — содержит(ключ) функцию-член для классов [unordered_]map/set/multimap/multiset. Отправили в LWG, на следующем собрании, возможно, примут на C++20.


Другие новые продукты

  • диапазон на основе for теперь может иметь следующий инициализатор:

    for (T thing = f(); auto& x : thing.items())

  • С этого момента вы можете создавать лямбды без сохранения состояния:

    using greater_t = decltype([](auto x, auto y) { return x > y; }); std::map<std::string, int, greater_t> map; constexpr greater_t comparator{}; // OK

  • std::is_pod и std::is_pod_v помечены как устаревшие.

  • Добавлен новый признак типа std::remove_cvref.
  • Атрибут [[nodiscard]] был добавлен в функции async(), new, allocate(), пустой() и launder().

  • std::memory_order* теперь доступны как перечисление с ограниченной областью действия.

  • Добавлены атомарные умные указатели:

    template <class T> struct atomic<shared_ptr<T>>; template <class T> struct atomic<weak_ptr<T>>;

  • В std::atomic добавлена поддержка чисел с плавающей запятой.

  • Множество мелких улучшений и исправлений.

В то же время полным ходом шла работа по подготовке модулей TS, а для Networking TS были добавлены многочисленные небольшие улучшения.



Вместо результатов

У вас есть идеи для C++20? Нашли проблемы в C++17, 14 или 11? Просто хотите ускорить разработку определенной функции C++? Посетите сайт рабочей группы: stdcpp.ru .

Добро пожаловать! Хотите помочь написать предложения и добавить свое имя в историю? Мы подготовили мини-инструкции по написанию предложений .

27 ноября состоится заседание WG21, где пройдет телеконференция с Герб Саттера и несколько выступлений.

Иди сюда - вот и все.

ссылка на регистрацию .

Наконец готовлюсь Встреча группы пользователей C++ В Нижнем Новгороде.




* Во всех этих случаях в стандарт были приняты слегка обновленные версии.

Теги: #программирование #C++ #IT-стандарты #компиляторы #библиотеки C++ #c++17 #atomic #networking #c++20 #constexpr #modules #c++2a #c++2a #c++2a #c + +2а #операторы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.