От Центральная часть Канада на юго-западе США! Альбукерке находится в Нью-Мексико:
На заседании Международного комитета по стандартизации C++, которое проходило в этом городе, было принято одно очень большое нововведение в C++20 и несколько мелких.
оператор <=>
В черновом варианте C++20 добавлен оператор космического корабля, который позволяет определять взаимосвязь элементов за одну операцию.В простых случаях это означает, что вы можете определить оператора космического корабля и ваш класс научится сравнивать любым способом: <, > , <=, > =, == и !=.
Пример:
Без оператора космического корабля | С оператором космического корабля |
---|---|
|
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 добавлена поддержка чисел с плавающей запятой.
- Множество мелких улучшений и исправлений.
Вместо результатов
У вас есть идеи для 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а #операторы
-
Обзор Ноутбука Toshiba Satellite L655-S5065
19 Oct, 24 -
Настройка Mikrotik Hap Mini Для Iptv Билайн
19 Oct, 24 -
Немного О Повторном Использовании Объектов
19 Oct, 24