Π£Ρ‚Π²ΡŠΡ€Π΄Π΅Π½ стандарт C++26

ΠšΠΎΠΌΠΈΡ‚Π΅Ρ‚ΡŠΡ‚ Π½Π° ISO Π·Π° стандартизация Π½Π° Π΅Π·ΠΈΠΊΠ° C++ Π·Π°Π²ΡŠΡ€ΡˆΠΈ ΠΈ ΡƒΡ‚Π²ΡŠΡ€Π΄ΠΈ Ρ„ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° вСрсия Π½Π° спСцификацията, която ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° мСТдународния стандарт β€žC++26β€œ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π΅Π½ΠΈΡ‚Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π² спСцификацията частично Π²Π΅Ρ‡Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ Π² ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ GCC, Clang ΠΈ Microsoft Visual C++. ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈΡ‚Π΅ C++26 стандартни Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Boost.

ΠŸΡ€Π΅Π· слСдващитС Π΄Π²Π° мСсСца ΡƒΡ‚Π²ΡŠΡ€Π΄Π΅Π½Π°Ρ‚Π° спСцификация Ρ‰Π΅ бъдС Π½Π° Π΅Ρ‚Π°ΠΏ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π·Π° публикация, ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΠΎΠ½Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° правописни Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ. Π’ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° Π½ΠΎΠ΅ΠΌΠ²Ρ€ΠΈ окончатСлният Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ Π² ISO Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ ISO/IEC 14882:2026.

Основни характСристики Π½Π° C++26:

  • Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ са Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ (Contracts), ΠΊΠΎΠΈΡ‚ΠΎ позволяват Π΄Π° сС опрСдСлят Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΈ спСцификации Π½Π° интСрфСйситС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ‚Ρ€ΠΈ Π½ΠΎΠ²ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°: pre (прСдусловиС), post (постусловиС) ΠΈ contract_assert (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‚Π²ΡŠΡ€Π΄Π΅Π½ΠΈΡ). ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ β€žpreβ€œ опрСдСля ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΈ условия, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ изпълнСни ΠΏΡ€Π΅Π΄ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ); β€žpostβ€œ β€” условия, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° сС спазват слСд ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ (изисквания Π·Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ); contract_assert β€” условия, ΠΏΡ€ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Ρ‰Π΅ сС появи Π² GCC 16. int f(const int x) pre (x != 1) // изисквания към Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ post (r : r == x && r != 2) // изисквания към Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°; r β€” стойността с Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° { contract_assert (x != 3); return x; }
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° рСфлСксия (Reflection), която позволява прослСдяванС ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π° Π΅Ρ‚Π°ΠΏ компилация. Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π½ΠΎΠ²ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ β€ž^^β€œ Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° мСтаинформация Π·Π° Π³Ρ€Π°ΠΌΠ°Ρ‚ΠΈΡ‡Π½Π°Ρ‚Π° конструкция ΠΈ β€ž[:…:]β€œ Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅. Π—Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° инспСкция информация Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° std::meta, Π° Π½Π°Π»ΠΈΡ‡Π½ΠΈ са Ρ‚Π°ΠΊΠΈΠ²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°Ρ‚ΠΎ изчислСния с константи. ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° рСфлСксия Ρ‰Π΅ бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π² GCC 16. constexpr int i = 42, j = 42; constexpr std::meta::info r = ^^i, s = ^^i; static_assert(r == r && r == s); static_assert(^^i != ^^j); // β€˜i’ ΠΈ β€˜j’ ΠΈΠΌΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ стойности. static_assert(constant_of(^^i) == constant_of(^^j)); // β€˜i’ ΠΈ β€˜j’ са Π΅Π΄Π½Π°ΠΊΠ²ΠΈ static_assert(^^i != std::meta::reflect_constant(42)); // Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° сС ΠΎΡ‚ стойността 42
  • Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Β«template forΒ» Π·Π° ΠΈΡ‚Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΡ‚ рСфлСксия (ΠΌΠ΅Ρ‚Π°ΠΎΠ±Π΅ΠΊΡ‚ΠΈ) Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° компилация Π² стил Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Ρ†ΠΈΠΊΡŠΠ». ΠŸΡ€ΠΈ изпълнСниС Π½Π° Β«template forΒ» тялото Π½Π° Ρ†ΠΈΠΊΡŠΠ»Π° сС Ρ€Π°Π·ΠΊΡ€ΠΈΠ²Π° Π·Π° всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ всяка итСрация сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° Π² ΠΎΡ‚Π΄Π΅Π»Π½Π° област Π½Π° видимост, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π°, промСняща сС Π² Ρ†ΠΈΠΊΡŠΠ»Π°, Π΅ константа. Π’ контСкста Π½Π° рСфлСксията Β«template forΒ» ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ Π·Π° ΠΎΠ±Ρ…ΠΎΠ΄ Π½Π° свойствата Π½Π° класовС ΠΈΠ»ΠΈ изброявания. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Ρ‰Π΅ сС появи Π² GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } Ρ‰Π΅ бъдС Ρ€Π°Π·ΠΊΡ€ΠΈΡ‚ΠΎ Π²: void f() { { constexpr auto&& __range = std::array{1, 2, 3}; constexpr auto __begin = __range.begin(); constexpr auto __expansion-size = __range.end() β€” __begin; // 3 { constexpr int I = *(__begin + 0); static_assert(I < 4); } { constexpr int I = *(__begin + 1); static_assert(I < 4); } { constexpr int I = *(__begin + 2); static_assert(I < 4); } } }
  • Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡŠΡ‚ std::execution Π·Π° асинхронно ΠΈ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ изпълнСниС Π½Π° ΠΊΠΎΠ΄. ΠžΡΠΈΠ³ΡƒΡ€ΡΠ²Π°Ρ‚ сС ΠΎΠ±Π΅ΠΊΡ‚ΠΈ scheduler, опрСдСлящи ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‡ΠΈΠΊΠ° Π·Π° изпълнСниС Π½Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ (нишка, ΠΏΡƒΠ» ΠΎΡ‚ нишки, GPU, event loop), sender, опрСдСлящ Ρ€Π°Π±ΠΎΡ‚Π° Π·Π° изпълнСниС, ΠΈ receiver β€” ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°. using namespace std::execution; scheduler auto sch = thread_pool.scheduler(); sender auto begin = schedule(sch); sender auto hi = then(begin, []{ std::cout < "Hello world! Have an int."; return 13; }); sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); auto [i] = this_thread::sync_wait(add_42).value();
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° std::simd Π·Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΡŠΡ€Ρ…Ρƒ Π΄Π°Π½Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π½Π°Π±ΠΎΡ€ΠΈ ΠΎΡ‚ инструкции SIMD, ΠΊΠ°Ρ‚ΠΎ AVX-512 ΠΈ NEON, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ стандартната систСма ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ²Π΅ C++. std::simd a = {1.0f, 2.0f, 3.0f, 4.0f}; std::simd b = {5.0f, 6.0f, 7.0f, 8.0f}; std::simd result = a + b;
  • ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Π΅ рСализация Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ (масив) с ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ std::inplace_vector, Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² стСка, Ρ‡ΠΈΠΉΡ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ сС опрСдСля Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° компилация. API-Ρ‚ΠΎ Π΅ Π±Π»ΠΈΠ·ΠΊΠΎ Π΄ΠΎ std::vector, Π½ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° масива сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π½Π΅ Π² Β«ΠΊΡƒΡ‡Π΅Β», Π° Π²ΡŠΡ‚Ρ€Π΅ Π² ΠΎΠ±Π΅ΠΊΡ‚Π°. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° Β«#embedΒ», ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π·Π° Π²Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΠΈΠ½Π°Ρ€Π½ΠΈ рСсурси Π² ΠΊΠΎΠ΄Π°. const unsigned char icon_display_data[] = { #embed "art.png" };
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° Π΅Ρ‚Π°ΠΏ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ ΠΏΡ€ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ Π² контСкста Π½Π° constexpr. constexpr std::optional checked_divide(unsigned n, unsigned d) { try { return divide(n, d); } catch (…) { return std::nullopt; } } constexpr date parse_date(std::string_view input) { auto [correct, year, month, day] = ctre::match(input); if (!correct) { throw incorrect_date{input}; } return build_date(year, month, day); }
  • Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π΅ структура ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ std::hive Π·Π° нСупорядочСно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ осигуряванС Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, освободСна слСд ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π° Π·Π° натоварвания с висока интСнзивност Π½Π° добавянС ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Ρ€Π΅Π΄. Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ масивитС, ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² std::hive Π½Π΅ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π° прСмСстванС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ, Π° просто ΠΏΠΎΠΌΠ΅Ρ‡Π°Π²Π° изтрития Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π°Π·Π΅Π½, с послСдващо запълванС Π½Π° освободСната позиция ΠΏΡ€ΠΈ добавянС Π½Π° Π½ΠΎΠ² Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° std::linalg с API Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½Π° Π°Π»Π³Π΅Π±Ρ€Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° BLAS.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° синхронизация Hazard pointer, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π΄Π° сС ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈ освобоТдаванСто Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, с ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π° Π΄Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈ нишки, Π±Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. ΠŸΡ€ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ Ρ‚ΠΎΠΉ само сС ΠΏΠΎΠΌΠ΅Ρ‡Π°Π²Π° ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚, Π½ΠΎ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, Π·Π°Π΅ΠΌΠ°Π½Π° ΠΎΡ‚ ΠΎΠ±Π΅ΠΊΡ‚Π°, сС освобоТдава само ΠΊΠΎΠ³Π°Ρ‚ΠΎ всички нишки свалят hazard-указатСля, Π·Π°Π΄Π°Π΄Π΅Π½ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ±Π΅ΠΊΡ‚Π°.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° синхронизация RCU (Read-Copy Update) β€” ΠΏΡ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° запис сС създава Π½ΠΎΠ² СкзСмпляр Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π°, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π΅ сС Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚, Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‚ Π΄Π° работят със стария СкзСмпляр. Π‘Π»Π΅Π΄ Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ новият СкзСмпляр става Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΈ Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π²Π΅Ρ‡Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ с Π½Π΅Π³ΠΎ, Π° старият СкзСмпляр сС ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π° слСд Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° чСтящитС Π³ΠΎ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ.
  • ВнСсСни са ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π·Π° усилванС Π½Π° сигурността Π½Π° стандартната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° допустимитС стойности ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ извън Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π°. НапримСр, ΠΏΡ€ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° "constexpr reference operator[](size_type idx) const;" сС добавя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π° условиСто "idx < size()".
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π΅Π½Π° Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° "constexpr" с разновидността Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° "new" (placement new) Π·Π° Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° структурирани ΠΏΡ€ΠΈΠ²Ρ€ΡŠΠ·ΠΊΠΈ (structured binding) Π² контСкста Π½Π° Β«constexprΒ», Ρ‚.Π΅. ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠΈ към константни ΠΈΠ·Ρ€Π°Π·ΠΈ сСга ΡΡŠΡ‰ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ константни ΠΈΠ·Ρ€Π°Π·ΠΈ. ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π·Π° масиви ΠΈ прости структури. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
  • Π’ структурирани ΡΠ²ΡŠΡ€Π·Π²Π°Π½ΠΈΡ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° синтаксиса β€ž...β€œ Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π°Ρ…Π²Π°Ρ‰Π°Ρ‚ останалитС Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΡ‚ присвояваната послСдоватСлност. auto [x,y,z] = f(); // Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ x, y, z Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ записани Ρ‚Ρ€ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π°, Π²ΡŠΡ€Π½Π°Ρ‚ΠΈ ΠΎΡ‚ f(). auto […xs] = f(); // Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° xs Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ записани всички Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ, Π²ΡŠΡ€Π½Π°Ρ‚ΠΈ ΠΎΡ‚ f(). auto [x, ...rest] = f(); // Π’ x Ρ‰Π΅ бъдС записан ΠΏΡŠΡ€Π²ΠΈΡΡ‚ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚, Π° Π² rest β€” останалитС. auto [x, y, ...rest] = f(); // Π’ x Ρ‰Π΅ бъдС записан ΠΏΡŠΡ€Π²ΠΈΡΡ‚ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚, Π² y β€” вторият, Π° Π² rest β€” трСтият. auto [x, ...rest, z] = f(); // Π² x β€” ΠΏΡŠΡ€Π²ΠΈΡΡ‚, Π² rest β€” вторият, Π² z β€” трСтият.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Β«Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½Π°Ρ‚Π° прСмСстванС» (Trivial Relocatability), която позволява ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€Π΅ΠΌeстванията Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚ΠΈΠΏ Ρ‡Ρ€Π΅Π· ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π±Π΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° конструктори ΠΈΠ»ΠΈ дСструктори. Π—Π° класовСтС са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ свойствата memberwise_trivially_relocatable ΠΈ memberwise_replaceable, Π° Π·Π° нискоурСдно прСмСстванС Π½Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ няколко ΠΎΠ±Π΅ΠΊΡ‚Π° са Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ trivially_relocate_at ΠΈ trivially_relocate.
  • Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° функция main() с глобалния ΠΌΠΎΠ΄ΡƒΠ» ΠΈ опрСдСлянС Π½Π° функция main() Π² ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«friendΒ» (Β«friend Ts…»).
  • Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ са Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ Π·Π° структурирани ΠΏΡ€ΠΈΠ²Ρ€ΡŠΠ·ΠΊΠΈ;
  • Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ синтаксис β€˜= delete(Β«ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Β»)’.
  • Π’ базовия Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ символи са Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ Β«@Β», Β«$Β» ΠΈ Β«`Β».
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π΅Π½Π° Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° структурирано ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ (structured binding) ΠΊΠ°Ρ‚ΠΎ условиС Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ if ΠΈ switch.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° няколко ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ-Π·Π°ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ с ΠΈΠΌΠ΅ Β«_Β» Π² Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° област Π½Π° видимост, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сСга Π²Π°Π»ΠΈΠ΄Π½ΠΈ конструкции са: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° сС извСТдашС ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌ -Wunused }
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π΅Π½Π° Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° стринг Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΈ Π² контСксти, Π² ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° масив ΠΎΡ‚ символи ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ Π² рСзултатния ΠΊΠΎΠ΄, Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ само ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация Π·Π° диагностични ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΈ прСпроцСсиранС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΈ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ _Pragma, asm, extern, static_assert, [[deprecated]] ΠΈ [[nodiscard]].
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Β«__builtin_is_within_lifetimeΒ» Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° активността Π½Π° Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΈ Π² обСдинСния (union) ΠΈ Β«__builtin_is_virtual_base_ofΒ» Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Π»ΠΈ базовият клас Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½.
  • Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ са Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½ΠΈ Π±Π΅Π·ΠΊΡ€Π°ΠΉΠ½ΠΈ Ρ†ΠΈΠΊΠ»ΠΈ Π±Π΅Π· Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
  • ΠžΡΠΈΠ³ΡƒΡ€Π΅Π½ΠΎ Π΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ ΠΎΠΏΠΈΡ‚ Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към нСпълСн Ρ‚ΠΈΠΏ.
  • ОбявСн Π·Π° остарял синтаксис Π½Π° опрСдСлянС Π½Π° Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ с ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ Π±Π΅Π· ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π°Ρ‰Π° запСтая (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС посочва Β«void e(int…)Β» вмСсто Β«void e(int, …)Β»).
  • Π—Π°Π±Ρ€Π°Π½Π΅Π½ΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° макроси Π·Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.
  • ΠŸΡ€Π΅Π²Π΅Π΄Π΅Π½ΠΎ Π² катСгорията Π½Π° остарСлитС ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° нСявни прСобразувания Π½Π° ΠΈΠ·Π±ΠΈΡ€Π°Π΅ΠΌΠΈ стойности Π² Π°Ρ€ΠΈΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‡Π½ΠΈ изчислСния. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // остаряло int k = f β€” e; // остаряло int x = +f β€” e; // OK }
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ сравнСниС Π½Π° масиви Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚Π΅Π½Π°. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
  • Шаблонният клас is_trivial Π΅ обявСн Π·Π° остарял.

    Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru
ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster