Саттер каже, мовляв, це найпотужніший стандарт з часів C++11, тож дивитимуся потихеньку, що там цікавого додали. Сьогодні про одну з таких фічей мова.
Мені завжди подобалося, як в 💻 (точніше SPARK) можна описувати перед- та постумови для функцій (приклад поцупив звідси):
procedure Set_Speed (S : in out Speed_Knots; New_Value : Speed_Knots)
with
Pre => New_Value >= 0.0 and New_Value <= 1000.0,
Post => S = New_Value;
Віднині в 💻 теж можна буде так робити! Має бути щось на кшталт отакого:
void set_speed(speed_knots & s, speed_knots new_value)
pre(new_value >= 0.0 && new_value <= 1000.0)
post(s == new_value);
Ну або уявімо, що треба перевірити значення, яке повертається, то буде щось отаке:
auto calculate(auto && val) post(r: is_valid(r));
Таким чином кількість того, що в C++ можна писати між блоком параметрів функції та її тілом, небезпечно наближається до Ada 🙂
Фіча зветься контрактами, якщо шо, і там окрім
pre та post ще додали так званий contract_assert. На вигляд наче звичайний assert, як і був, тільки тепер не сішний макрос, а прям інструкція самої мови. Можна користуватися всередині функцій, щоб додати обрисів очікуванням від коду.Отже, загалом корисно на вигляд. Хоча спершу варто почитати правила, за якими ця фіча взаємодіє з іншими 😉 На закуску тримайте приклад, як це виглядає в трохи реальнішому коді. Тут вам і концепти, і контракти, і
constexpr, і trailing return type, і structured binding. template <std::floating_point T>
constexpr auto normalize(std::array<T, 3> vector) noexcept -> std::array<T, 3>
pre(is_normalizable(vector))
post(vector: is_normalized(vector))
{
auto& [x, y, z]{vector};
const auto norm{std::hypot(x, y, z)};
x /= norm, y /= norm, z /= norm;
return vector;
}