ΠžΠ΄ΠΎΠ±Ρ€Π΅Π½ стандарт C++20

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

ΠŸΡ€Π΅Π· слСдващитС Π΄Π²Π° мСсСца ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π°Ρ‚Π° спСцификация Ρ‰Π΅ бъдС Π² Π΅Ρ‚Π°ΠΏ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅, Π² ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° правописни Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ. Π’ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° Π½ΠΎΠ΅ΠΌΠ²Ρ€ΠΈ Ρ„ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° вСрсия Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½Π° Π² ISO Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ ISO/IEC 14882:2020. ΠŸΡ€Π΅Π· Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ΡŠΡ‚ Π²Π΅Ρ‡Π΅ Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π°Π» Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ слСдващия стандарт C++23 (C++2b) ΠΈ Π½Π° Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠΎΡ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΎ засСданиС Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈΡ‚Π΅ нововъвСдСния.

Основни характСристики C++20 (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠ΄):

  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са β€žΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈβ€œ, Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° шаблони, ΠΊΠΎΠΈΡ‚ΠΎ позволяват Π΄Π° сС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ изисквания Π·Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° шаблона, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилацията ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Ρ‚ Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° шаблона. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚, Π·Π° Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π°Ρ‚ логичСски Π½Π΅ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ свойствата Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π²ΡŠΡ‚Ρ€Π΅ Π² шаблона, ΠΈ свойствата Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π° Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ.

    template
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ са Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ вмСсто Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. ΠœΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ прСдоставят Π½ΠΎΠ² Π½Π°Ρ‡ΠΈΠ½ Π·Π° организация Π½Π° изходния ΠΊΠΎΠ΄ въз основа Π½Π° опрСдСлянСто Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅, Π±Π΅Π· Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ Ρ‡Ρ€Π΅Π· β€ž#includeβ€œ Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.
  • ΠœΠ°ΠΊΡ€ΠΎΡ __VA_OPT__ Π·Π° Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΈ макроси Π² зависимост ΠΎΡ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΈ Π² вариативния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° β€žβ€œ Π·Π° Ρ‚Ρ€ΠΎΠΉΠ½ΠΎ сравнСниС.
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π°.
  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Π»Π°ΠΌΠ±Π΄Π° Π·Π°Ρ…Π²Π°Ρ‚ Π½Π° ΠΈΠ·Ρ€Π°Π·ΠΈ β€ž*thisβ€œ.

    struct int_value {
    int n = 0;
    auto getter_fn() {
    // BAD:
    // return [=]() { return n; };

    // GOOD:
    return [=, *this]() { return n; };
    }
    };

  • ИзвикванС Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» (Pointer-to-member), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ‡Ρ€Π΅Π· ΠΈΠ·Ρ€Π°Π·Π° β€žconst &β€œ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ.
  • ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete с дСструктор, описан Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° P0722R1.
  • На класовСтС Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° шаблон Π±Π΅Π· Ρ‚ΠΈΠΏ.

    struct foo {
    foo() = default;
    constexpr foo(int) {}
    };

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π΅Π½ конструктор
    get_foo();

  • ΠΠ΅ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½ΠΈ лямбда ΠΈΠ·Ρ€Π°Π·ΠΈ с конструктор.
  • Допустимост Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° синтаксиса Π½Π° шаблони Π·Π° лямбда ΠΈΠ·Ρ€Π°Π·ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«auto f = [](std::vector v)Β»).
  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° стринг Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€ΠΈ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° шаблона.
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° синтаксиса Π·Π° инициализация Π² стил C β€” явно Π½Π΅ ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈ Π² списък Π·Π° инициализация ΠΏΠΎΠ»Π΅, сС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

    struct A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2

  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΏΡ€Π°Π·Π½ΠΈ Ρ‡Π»Π΅Π½ΠΎΠ²Π΅ Π½Π° структурни Π΄Π°Π½Π½ΠΈ.
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΡ‚Π΅ likely ΠΈ unlikely Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π·Π° вСроятността Π½Π° условни конструкции (Β«[[likely]] if (random > 0) {Β»).
  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° стойности Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π² Ρ†ΠΈΠΊΡŠΠ» Β«forΒ»

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • Автоматично изчисляванС Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° масив Π² new (Β«new double[]{1,2,3}Β»);
  • Атрибут Β«[[no_unique_address]]Β», ΠΏΡ€ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π±Π΅Π· Π΄Π°Π½Π½ΠΈ Π½Π΅ Π·Π°Π΅ΠΌΠ°Ρ‚ място.
  • Атомарни ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (std::atomic<shared_ptr> ΠΈ std::atomic<weak_ptr>).
  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² условни ΠΈΠ·Ρ€Π°Π·ΠΈ.
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π±ΡŠΡ€Π·ΠΈ (immediate) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° работят само с константи.

    consteval int sqr(int n) {
    return n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ константа

  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° constexpr с Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Β«constexpr virtual int f() const { return 2; }Β»).
  • Π’ стандартната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°:
    • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Ρ‚ΠΈΠΏΠ° char8_t Π·Π° UTF-8 стринговС.
    • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ bit (Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ) ΠΈ version.
    • Появи сС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° прСфикс ΠΈ суфикс Π½Π° стринговС (starts_with, ends_with).
    • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Ρ‚ΠΈΠΏΠ°ΠΆΠΈ std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ΠΈ std::type_identity.
    • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated ΠΈ std::assume_aligned.
    • Π’ std::make_shared Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° масиви.
    • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ функция std::to_array Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π° масиви, Π² std::array.
  • По-ΡƒΠ΄ΠΎΠ±Π΅Π½ синтаксис Π·Π° изброСния:

    enum class rgba_color_channel { red, green, blue, alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    switch (my_channel) {
    using enum rgba_color_channel;
    case red: return Β«redΒ»;
    case green: return Β«greenΒ»;
    case blue: return Β«blueΒ»;
    case alpha: return Β«alphaΒ»;
    }
    }

  • Π’ индСкситС Π΅ Π·Π°Π±Ρ€Π°Π½Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° опСрацията β€ž,” (β€ža[b,c]β€œ) ΠΏΠΎΡ€Π°Π΄ΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, обявСни с ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° volatile, Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚Π΅Π½Π°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ β€ž++β€œ ΠΈ β€žβ€”β€œ със стандартни Ρ‚ΠΈΠΏΠΎΠ²Π΅.
  • Π‘ΡŠΠΊΡ€Π°Ρ‚ΠΈ сС броят Π½Π° ситуациитС, Π² ΠΊΠΎΠΈΡ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΡƒΠΊΠ°Π·Π²Π° β€žtypenameβ€œ, Π·Π° Π΄Π° сС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΈΠΏ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

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