рдЬреВрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдорд╛рдирдХреАрдХрд░рдг C ++ рдкрд░ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рдХрд╛рд░реНрдпрдХрд╛рд░реА рд╕рдореВрд╣ WG21 рдХреА рдмреИрдардХ рд░реИрдкрд░рд╡рд┐рд▓-рдпреЛрдирд╛ рд╢рд╣рд░ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реБрдИред

рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХрдЯ рдХреЗ рддрд╣рдд рдХреНрдпрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ:
- рд╕рдВрд╡рд┐рджрд╛ рдФрд░ рдорд┐рддреНрд░
- рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рдХреЛрдИ рджреЛрд╕реНрдд рдирд╣реАрдВ)
- __has_cpp_attribute (рдЕрд╕рдВрднрд╛рд╡рд┐рдд)
- рдмрд┐рдЯ_рдХрд╛рд╕реНрдЯ <my_stuff> (some_array)
- рд╢рд╛рдорд┐рд▓ рд╣реИ , shift_left , shift_right , ispow2 , ceil2 ... рдФрд░ рдирдИ рд╕реЙрд╕ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо
- atomic_ref
- рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдХреНрдпрд╛ рдирдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ
- constexpr рдЖрднрд╛рд╕реА рдлреВ ()
- рд╕рдорд╛рдирд╛рдВрддрд░рд╡рд╛рдж 2, рдкрд░рд╛рд╡рд░реНрддрди, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЯреАрдПрд╕
рдПрдХ рдмреЛрдирд╕ рднреА рд╣реЛрдЧрд╛: рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдШреБрдХрд░рдг:
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдШреЛрд╖рд┐рдд рдЖрднрд╛рд╕реА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЯрд╛рдЗрдк рддреБрдЪреНрдЫрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
- рдореИрдВ рдПрдХ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдХрд╣рд╛рдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
- constexpr std :: regex mail_regex (R "(?:? (?: [^ <>) ([\ \]ред; ;: \ s @ \"] + (?: \ _ [^> () \ _) \]ред; ;: \ _ @ \ "] +) *) | \" + \ "") @ (?:!: (?:: [^ <> () \ [\ \]ред;: \ s @ \ " ] + \ _ред) + [^ <> () \ [\];;: \ s @ \ "] {2,})}))
рдареЗрдХреЗ
C ++ 20 рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдиреБрдмрдВрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ред рддреЛ, рдпрд╣ рдЬрд▓реНрдж рд╣реА рдореБрдЦрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдмреЙрдХреНрд╕ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд▓реЗрдЦрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рднреА рджреЗрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЕрдиреБрдмрдВрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
std::string get_name_by_login(std::string_view login)
    [[expects: !login.empty() ]]
    [[ensures ret_value: !ret_value.empty() ]]
;
, , . , :
- ( ) .
- ( ) . , , .
- (, doxygen) / .
- , (, ).
.
21 Fails, . , :
void(const std::contract_violation & e) noexcept {
    std::cerr << "Contract violated in function " << e.function_name() << '\n'
        << std::stacktrace();
}
:
Contract violated in function std::array<T, N>::operator[](size_type) [with T = int; long unsigned int N = 5ul; ]': 
 0# std::array<int, 5ul>::operator[](unsigned long) at /usr/include/c++/array:124
 1# bar(int) at ../example/assert_handler.cpp:17
 2# foo(int) at ../example/assert_handler.cpp:25
 3# main at ../example/assert_handler.cpp:54
 4# 0x00007F991FD69F45 in /lib/x86_64-linux-gnu/libc.so.6
 5# 0x0000000000401139
}
std::stacktrace C++20, design review LEWG, LWG. 
.
, Ranges TS. compile-time :
template <class F>
    requires Invocable<F>
void my_executor::execute(F f) noexcept {
    lock_guard l{data_mutex_};
    push(std::move(f));
}
proposal.
Feature-test macros
. . 
unlikely, 
__has_cpp_attribute(unlikely).
, 
.
bit_cast
reinterpret_cast тАУ . , . C++ .
,
 my_type my = reinterpret_cast<my_type&>(some_array); 
my_type my = std::bit_cast<my_type>(some_array); 
, some_array my_type , , . , type aliasing.
, C++20:
- shift_left(it_begin, it_end, unsigned n) тАУ n, *it_begin = std::move(*(it_begin + n)), *(it_begin + 1) = std::move(*(it_begin + n + 1))...
- shift_right(it_begin, it_end, unsigned n) тАУ , , *(it_begin + n) = std::move(*it_begin), *(it_begin + n + 1) = std::move(*(it_begin + 1))...
- ispow2(x) тАУ true ,
- ceil2(x) тАУ ,
- contains тАУ bool contains(const key& v), true
, , 
std::swap std::swap constexpr. , 
std::nth_element . 
21.
atomic_ref
, - ? atomic_ref<T> ( 
).
, , 
atomic_ref<T>. 
atomic_ref, 
atomic_ref, .
, (string
_view, atomic
_ref), 
. , .
X, 
operator<=> :
struct X {
    // ...
    std::strong_equality operator<=>(const X&, const X&) = default;
    // ...
};
:
template <X x>
struct x_as_template_param {
    // ...
};
operator<=>.
constexpr virtual
, , constexpr .
constexpr virtual int foo();, 
int foo() constexpr, . 
foo() , constexpr .
, , 
std::type_info, 
Boost.TypeIndex, compile-time :
template <class T, class U>
constexpr bool is_same() {
    constexpr bool res = (typeid(T) == typeid(U));
    return res;
}
.
Parallelism 2, Reflection Executors TS
Parallelism 2 , 
. type traits, simd .
Reflection (TS). , 
<type_traits>. constexpr 
constexpr! (. ).
Executors C++20, , , TS. , .
user-declared virtual destructor
, C++20 ( ), , :
struct i_am_trivial {
    int foo;
    char bar;
    virtual ~i_am_trivial() = default;
};
, , . , , , , . , , 
std::vector<Base>, Base .
constexpr!
, C++20 тАУ 
constexpr! .
, runtime . C++.
constexpr! . .. 
constexpr! , ( ) . , . , , 
Boost.Hana [Boost.]PFR.
: constexpr std::regex
/ . , , .
C++ :
bool is_valid_mail(std::string_view mail) {
    static const std::regex mail_regex(R"((?:(?:[^<>()\[\].,;:\s@\"]+(?:\.[^<>()\[\].,;:\s@\"]+)*)|\".+\")@(?:(?:[^<>()\[\].,;:\s@\"]+\.)+[^<>()\[\].,;:\s@\"]{2,}))");
    return std::regex_match(
        std::cbegin(mail),
        std::cend(mail),
        mail_regex
    );
}
is_valid_mail(). , .
constexpr (constexpr new, is_constexpr_evaluated() .) C++ , 
constexpr std::regex.
constexpr std::regex is_valid_mail() . , GCC 
static const, .. GCC-6 
constexpr тАУ , GCC .
, 
constexpr std::regex?
P.S.: