рджреВрд╕рд░реЗ рджрд┐рди рдХреЛрд▓реЛрди рдореЗрдВ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рдорд╛рдирдХреАрдХрд░рдг рд╕рдорд┐рддрд┐ C ++ рдХреА рдмреИрдардХ рдереАред рдкрд┐рдЫрд▓реА рдмрд╛рд░, C ++ 20 рдореЗрдВ рдлрд╝реАрдЪрд░ рдлрд╝реНрд░реАрдЬрд╝ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╕рдорд┐рддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрд╡реАрдХреГрдд рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╕реБрдзрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ C ++ 23 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП ...
... рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛!

рдЙрдиреНрд╣реЛрдВрдиреЗ std рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ :: flat_map; рдХреНрдпрд╛ рдбрд░рд╛рд╡рдиреЗ рдХреАрд╡рд░реНрдб co_return, co_await рдФрд░ co_yield рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗ; рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ :: рдкреНрд░рд╛рд░реВрдк; C ++ 20 рдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдмрдВрдз рд╣реЛрдВрдЧреЗ? рдпрд╣ рд╕рдм рдЖрдкрдХреЛ рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдп рд╕рдореВрд╣
рд╕реЛрдорд╡рд╛рд░
рджрд┐рди рд╡реНрдпрд╕реНрдд рдерд╛ - рд╣рдордиреЗ рдХреИрдорд▓рдХреЗрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рдБрдк_рдХреЗрд╕ рдореЗрдВ рд╕рднреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 
P1607 рдкреНрд░рд╕реНрддрд╛рд╡, рдЬреЛ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рд╣реИ) рдХреЛ 
рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЖрд╡рд╛рдЬ рджреА рдЧрдИ рдереА ред
рдордВрдЧрд▓рд╡рд╛рд░
рдХреЛрд░рдЯрд┐рдиреНрд╕ рдиреЗ рдЪрд░реНрдЪрд╛ рдХреАред 
Coroutine рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рд╕реЗ co_ рдбреНрд░реЙрдк рдХрд░рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд╣рд┐рдд, рд╕рдм рдХреБрдЫ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░ рджрд┐рдпрд╛ред рдЕрдлрд╕реЛрд╕ред
рдмреБрдзрд╡рд╛рд░
рдЕрдЪрд╛рдирдХ рд╣рдореЗрдВ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ 
P1607 рдХреЛ рд╕реЛрдорд╡рд╛рд░ рдХреЛ рдордВрдЬреВрд░реА рдирд╣реАрдВ рджреА, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕реЗ рд▓рдЧрднрдЧ 30 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ, рдЬрдмрдХрд┐ рдЕрдиреБрдмрдВрдзреЛрдВ рдкрд░ рдореМрдЬреВрджрд╛ рдирд┐рд░реНрдгрдп рдХреЛ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдореНрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдЕрдиреБрдмрдВрдз рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ C ++ 20 рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдЙрдиреНрд╣реЗрдВ рдорд╛рдирдХ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
рдЧреБрд░реБрд╡рд╛рд░ рдХрд╛ рджрд┐рди
C ++ 23 рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЪреАрдЬреЗрдВред рдореБрдЦреНрдп рдмрд▓реЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдирдП рддрдВрддреНрд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд┐рд╖рдп рдкрд░ рджреЛрдиреЛрдВ 
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдереЗ рдФрд░ 
рдирдП рдереНрд░реЛ рдЕрдкрд╡рд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк
рд╕рдорд┐рддрд┐ рдореЗрдВ рдПрдХ рдЙрдкрд╕рдореВрд╣ рдПрд▓рдбрдмреНрд▓реНрдпреВрдЬреА рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рдЗрд╕ рдЙрдкрд╕рдореВрд╣ рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрд▓рдбрдмреНрд▓реНрдпреВрдЬреА рдХрд╛ рдФрд╕рдд рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рддрд┐ рд╕рдкреНрддрд╛рд╣ ~ 30 рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИред рдХреЛрд▓реЛрди рдореЗрдВ, 50 рд╕реЗ рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рдЖрдзреЗ рдмреЗрд╣рдж рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдЖрдХрд╛рд░ рдереЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
* 
std :: flat_map* 
std :: jthread* 
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ <=>* 
рдирдИ рддреБрд▓реНрдпрдХрд╛рд▓рди рдЖрджрд┐рдо+ рдкреЗрдкрд░ рдИрдбрдмреНрд▓реНрдпреВрдЬреА рд╕реЗ рд╕реНрдиреЗрдХ_рдХреЗрд╕ рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рдерд╛ред
рдкрд╣рд▓реЗ рд╕реЗ рдЕрдиреБрдореЛрджрд┐рдд рдореЗрдВ рд╕реЗ рдХреМрди рд╕реА C ++ 20 рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛
- constexpr рдореЗрдВ рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рд╢реВрдиреНрдп-рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ ред Int i {} рдХреЗ рд╕рд╛рде рдбрд╛рдЙрди; long live int iред
- рдЕрдм рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЕрдм рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрдИ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
 
 #include <type_traits>
template<typename T>
struct Optional {
    // ...
    ~Optional() requires(std::is_trivially_destructible_v<T>) = default;
    ~Optional() requires(!std::is_trivially_destructible_v<T>) {
        if (inited_) reinterpret_cast<T&>(data_).~T();
    }
private:
    bool inited_{false};
    std::aligned_storage_t<sizeof(T), alignof(T)> data_;
};
 
- [[nodiscard]] . , :
 
 template <class F>
[[nodiscard("Without storing the result the code executes synchronously")]] future async(F&& );
auto test() {
    // ...
    // warning: Without storing the result the code executes synchronously
    async([huge_data](){
        std::cerr << huge_data;
    });
}
 
- using enum:
 
 enum class rgba_channel { kRed, kGreen, kBlue, kAlpha};
std::string_view to_string(rgba_channel channel) {
  using enum rgba_channel;
  switch (channel) {
    case kRed:   return "red";
    case kGreen: return "green";
    case kBlue:  return "blue";
    case kAlpha: return "alpha";
  }
}
 
- Deduction guides :
 
 template <typename T>
struct S {
    T x;
    T y;
};
S t{'4', '2'}; // Deduces `S<char>`
 
- __asm constexpr ( !)
- . :
 
 void f(int(&)[]); // p.s.:        
int arr[1];
f(arr);          // OK
 
- C++20
- constinit :
 
 int count_invocations() {
    //   ,   
    //   `counter`  .
    //
    //   -  ,  
    //         
    // `counter`   .
    static constinit std::atomic<int> counter{0};
    return ++counter;
}
 
- .
- volatile deprecated. .
- [[nodiscard]] , :
 
 struct [[nodiscard]] my_scopeguard { /* ... */ };
struct my_unique {
    [[nodiscard]] my_unique(int fd) { /* ... */ } //    
    /* ... */
};
void sample() {
    my_scopeguard(); // warning
    void(my_scopeguard()); // cast  void, warning  
    my_unique(42); // warning
}
 
- Class Template Argument Deduction 
- std::vector placement new constexpr
- <bit> . , / /, тАФ .
- <format> , chrono locale float:
 
 constexpr auto birthday = 28d/April/1989;
string s = format("At {0:%d} of {0:%B}, {0:%Y} someone was born", birthday);
assert(s == "At 28 of April, 1989 someone was born");
 
- constexpr bind, invoke, reference_wrapper
- <numbers>
- wait notify. conditional_variable:
 
 #include <atomic>
enum class States {
    kInitial, kProcessing, kPosting,
};
// !  !
std::atomic<States> state{States::kInitial};
void state_machine_do_posting() {
    for (;;) {
        States expected_state = States::kProcessing;
        //        kProcessing
        state.wait(expected_state);
        if (!state.compare_exchange_strong(expected_state, States::kPosting)) {
            continue;
        }
        // do something
    }
}
 
- snake_case
- operator != operator ==. , operator <=>
- std::*stringstream std::basic_stringbuf :
 
 std::string to_string(const MyType& v) {
    std::string buf;
    constexpr std::size_t kMaxSize = 32;
    buf.reserve(kMaxSize);
    //  C++20  ,  C++20 тАФ   
    std::ostringstream oss{std::move(buf)};
    oss << "MyType{" << v << '}';
    //  C++20  ,  C++20 тАФ 
    return std::move(oss).str();
}
 
- std::jthread:
 
 #include <thread>
void sample() {
    bool ready = false;
    std::mutex ready_mutex;
    std::condition_variable_any ready_cv; //   `_any`!
    std::jthread t([&ready, &ready_mutex, &ready_cv] (std::stop_token st) {
        while (!st.stop_requested()) {
          /* ... */
          {
            std::unique_lock lock{ready_mutex};
            //    ready == true,  stop_token.request_stop(),
            //  jthread.request_stop().
            ready_cv.wait_until(lock, [&ready] { return ready; }, st);
          }
          /* ... */
        }
    });
    /* ... */
    //  `t`  request_stop()       .
}
 
- type_traits , .
 
 antoshkka C++14 CppCon. , . тАж , . ,. , type_traits : Over dinner at CppCon, Marshall Clow and I discussed a bit of code that relied on two types being layout-compatible. As it happened, the types werenтАЩt layout-compatible after all. I opined that there should be a way to statically assert layout-compatibility, so that the error would be caught at compile time, rather than dinner time. Marshall replied, тАЬWrite a proposal.тАЭ This is that proposal.
 
 
 
- std::source_location, , .
- unordered . .
, std::stacktrace, std::flat_map, std::flat_set C++20 :(
++23
, Boost.Process , /, , , 2d , , JIT C++ .
. 
std::filesystem::path_view. path_view , .
21
, , , , , , . , , std::format Inf/NaN; jthread; 
pair, tuple, string, array.
SG1 Concurrency concurrent_unordered_map. visit value , :
concurrent_unordered_map<int, std::string> conc_map;
conc_map.visit(42, [](std::string& value) { // ,  ....
    //    OK.  OK        value.
    std::cerr << value; 
    //    OK.  OK        value.
    value += "Hello"; 
});
.
, :
concurrent_unordered_map<int, std::atomic<int>> conc_map;
conc_map.visit(42, [](std::atomic<int>& value) { // ,  ....
    //  OK
    ++ value; 
});
SG6 Numerics тАФ Numerics TS , wide_integer .
C++ Piter, .
21 ISO 9 (
 , ). C++20 C++23.