Пам-пам. Наступила очередь пачки рандомных фактов/ссылок/чего-то ещё.
1. Я думаю, уже чуть ли не каждый видел концепты из C++20. Интересный факт, что в текущем виде (авторства Andrew Sutton'а) они называются concepts lite, потому что первые концепты авторства Bjarne Stroustrup выглядели примерно так:
concept EqualityComparable<typename T> {
requires constraint Equal<T>;
requires axiom Equivalence_relation<Equal<T>, T>;
// if x == y then for any Predicate p, p(x) == p(y)
template <Predicate p>
axiom Equality(T x, T y, P p) {
x == y => p(x) == p(y);
}
// inequality is the negation of equality
axiom Inequality(T x, T y) {
(x != y) == !(x == y);
}
};Ух. Тут и семантические ограничения, и синтаксические. И бог весть знает что ещё. Собсна потому текущие концепты это lite. Потому что была вот такая хардовая версия, которую отказались принимать, потому ту мач сложно. Можете вот тут чуть-чуть почитать.
2. В дополнение к концептам хотят подвезти контракты. Конечно по срокам ничего не понятно. Вот так это примерно будет выглядеть:
int f(int x, int y)
[[ expects: x > 0 ]] // precondition
[[ expects: y > 0 ]] // precondition
[[ ensures r: r < x + y ]] // postcondition
{
int z = (x - x%y) / y;
[[ assert: z >= 0 ]]; // assertion
return z + y;
}Можно посмотреть старый пропозал из любопытства.
Вот текущий. Пока ещё есть вопросы по синтаксису. В качестве расширения в будущем ещё предлагают сделать захват по значению переменных (не оч понял зачем).
3. Это конечно же баян, но вот пример:
template <class T> struct A {
void g() {}
};
template <class T> struct C : A<T> {
void f() { g(); }
};В таком виде код не скомпилируется, потому что в нашей структурке нет такой функции, и неизвестно, будет ли она в специализации A. Чтобы сообщить, что g() есть в каждой специализации A можно заюзать самую недооценённую фичу:
this:template <class T> struct C : A<T> {
void f() { this->g(); }
// or using A<T>::g;
};4. Давайте посмотрим на сигнатуру
std::for_each:template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);Зачем тут возвращается
UnaryFunction? Подразумевается, что ваш функтор может быть быть классом с каким-то стейтом, потому нужно вернуть итоговый функтор. Интересно, что в std::sort логика другая:template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);Тут тоже компаратор -- любой функтор. Но функция ничего не возвращает : ) Лол короч.
5. Интересный факт, что возможность NRVO (т.к. это необязательная оптимизация) выясняется по анализу скоупа, а не конкретного выполняющегося кода. Можно посмотреть примеры и пояснений в этом и следующем постах на канале (кстати довольно интересном) у @cloudy_district.
6. На летней C++ Zero Cost Conf был доклад Тимура Думлера про real-time вычисления. Интересно было как минимум понять, о чём это. Кстати увидел на том же канале : )
Тут есть интересный факт, что нельзя иметь одновременно равновероятный для всех чисел в промежутке рандом, работающий за детерменированное кол-во шагов. Либо одно, либо второе.
7. Ещё у Жени есть очень крутые статьи на хабре. Кажется, пару штук я даже постил. Из последнего мне очень понравилось про Неклассические контейнеры в C++. Увидел бы я её, когда писал пост про вектор...
Кстати из неё узнал, что в бусте некоторым контейнерам можно задавать политику ресайза. Правда в довольно простом виде, но всё же.
8. Интересная заметка о том, как отлаживать bash-скрипты.
9. Как и зачем писать хороший код. Доклад Григория Петрова на Golang Conf 2019. Кстати довольно известный, я так понял, в локальных кругах чувак. По крайней мере он вёл несколько промежуточных бесед на Highload++ Foundation 2022 в середине мая. Что-то удалось посмотреть, почти всё не удалось посмотреть. Будем полгода ждать записи, отсматривать и рассказывать вам.