Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ΡŠΡ‚ C++20 Π΅ ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½.

ΠšΠΎΠΌΠΈΡ‚Π΅Ρ‚ΡŠΡ‚ ΠΏΠΎ стандартизация Π½Π° Π΅Π·ΠΈΠΊΠ° C++ Π½Π° ISO ΠΎΠ΄ΠΎΠ±Ρ€ΠΈ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π΅Π½ стандарт β€ž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;
    };

  • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ са Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ вмСсто Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. ΠœΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ прСдоставят Π½ΠΎΠ² Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° изходния тСкст Π½Π° base Π½Π° опрСдСлянС Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅, Π±Π΅Π· Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Ρ‡Ρ€Π΅Π· β€ž#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(); // uses implicit constructor
    get_foo();

  • НС Π·Π°ΠΏΠ°Π·Π²Π°Ρ‰ΠΈ лямбда-ΠΈΠ·Ρ€Π°Π·ΠΈ с конструктор.
  • Допустимост Π½Π° синтаксиса Π½Π° ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ Π·Π° лямбда-ΠΈΠ·Ρ€Π°Π·ΠΈ ("auto f = [<typename T>(std::vector<T> 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<T>> ΠΈ std::atomic<weak_ptr<T>>).
  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² условни ΠΈΠ·Ρ€Π°Π·ΠΈ.
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π±ΡŠΡ€Π·ΠΈ (immediate) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° работят само с константи.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // Π“Π Π•Π¨ΠšΠ: '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