Εγκεκριμένο πρότυπο C++20

Επιτροπή ISO για την Τυποποίηση της Γλώσσας C++ εγκρίθηκε Διεθνές πρότυπο "C ++ 20". Οι δυνατότητες που παρουσιάζονται στις προδιαγραφές, με εξαίρεση μεμονωμένες περιπτώσεις, υποστηρίζεται σε μεταγλωττιστές GCC, Κλαγγή и Microsoft Visual C ++. Στο πλαίσιο του έργου υλοποιούνται τυπικές βιβλιοθήκες που υποστηρίζουν C++20 Ώθηση.

Τους επόμενους δύο μήνες, η εγκεκριμένη προδιαγραφή θα βρίσκεται στο στάδιο της προετοιμασίας του εγγράφου για δημοσίευση, στο οποίο θα γίνουν εργασίες για τη συντακτική διόρθωση των ορθογραφικών λαθών και των τυπογραφικών σφαλμάτων. Στις αρχές Νοεμβρίου, το έγγραφο που θα προκύψει θα σταλεί στο ISO για δημοσίευση με την επίσημη ονομασία ISO/IEC 14882:2020. Εν τω μεταξύ, η επιτροπή έχει ήδη ξεκινήσει τις εργασίες για το επόμενο πρότυπο C++23 (C++2b) και θα εξετάσει πιθανές επιλογές στην επόμενη εικονική συνεδρίασή της. καινοτομίες.

Ο κύριος χαρακτηριστικά C ++ 20 (παραδείγματα κωδικών):

  • Προστέθηκαν "έννοιες", επεκτάσεις σε πρότυπα, που σας επιτρέπουν να ορίσετε ένα σύνολο απαιτήσεων παραμέτρων προτύπου που, κατά το χρόνο μεταγλώττισης, περιορίζουν το σύνολο των ορισμάτων που μπορούν να γίνουν αποδεκτά ως παράμετροι προτύπου. Οι έννοιες μπορούν να χρησιμοποιηθούν για την αποφυγή λογικών ασυνεπειών μεταξύ των ιδιοτήτων των τύπων δεδομένων που χρησιμοποιούνται στο πρότυπο και των ιδιοτήτων τύπου δεδομένων των παραμέτρων εισόδου.

    πρότυπο
    έννοια EqualityComparable = απαιτεί(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Αποδεκτό επεκτάσεις για εργασία με μονάδες που μπορούν να χρησιμοποιηθούν αντί για αρχεία κεφαλίδας. Οι μονάδες παρέχουν έναν νέο τρόπο οργάνωσης του πηγαίου κώδικα με βάση τον καθορισμό των ορίων των στοιχείων, χωρίς να συμπεριλαμβάνονται αρχεία κεφαλίδας μέσω του «#include».
  • Μακροεντολή __VA_OPT__ για προσαρμοστική επέκταση μεταβλητών μακροεντολών ανάλογα με την παρουσία διακριτικών στο όρισμα της μεταβλητής.
  • Υποστήριξη για τον τελεστή "" για σύγκριση τριών κατευθύνσεων.
  • Υποστήριξη προεπιλεγμένων αρχικοποιητών στοιχείων για πεδία bit.
  • Δυνατότητα λήψης λάμδα εκφράσεων "*αυτό".

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

    // ΚΑΛΟΣ:
    return [=, *this]() { return n; };
    }
    };

  • Κλήση στοιχείων με δείκτη (Pointer-to-member), χρησιμοποιώντας δείκτες σε προσωρινά αντικείμενα που ορίζονται μέσω της έκφρασης "const &".
  • Ο χειριστής διαγραφής με έναν καταστροφέα που περιγράφεται στο έγγραφο P0722R1.
  • Οι κλάσεις επιτρέπεται να χρησιμοποιούν παραμέτρους προτύπου χωρίς τύπο.

    struct foo {
    foo() = προεπιλογή;
    constexpr foo(int) {}
    };

    πρότυπο
    auto get_foo() {
    επιστροφή f;
    }

    get_foo(); // χρησιμοποιεί σιωπηρό κατασκευαστή
    get_foo ()

  • Μη επίμονες εκφράσεις λάμδα με κατασκευαστή.
  • Επιτρέπεται η σύνταξη προτύπου για εκφράσεις λάμδα ("auto f = [] (std:: vector v)").
  • Δυνατότητα χρήσης συμβολοσειρών σε παραμέτρους προτύπου.
  • Υποστήριξη για σύνταξη αρχικοποίησης τύπου C - τα πεδία που δεν αναφέρονται ρητά στη λίστα αρχικοποίησης αρχικοποιούνται από προεπιλογή.

    δομή Α {
    intx;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • Υποστήριξη για κενά μέλη δομής δεδομένων.
  • Υποστήριξη για τα πιθανά και απίθανα χαρακτηριστικά που ενημερώνουν τον βελτιστοποιητή σχετικά με την πιθανότητα να ενεργοποιηθεί η υπό όρους κατασκευή ("[[πιθανόν]] εάν (τυχαία > 0) {").
  • Δυνατότητα χρήσης περιοχών για την προετοιμασία μεταβλητών τιμών σε βρόχο "for".

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

  • Αυτόματος υπολογισμός του μεγέθους του πίνακα σε νέα ("new double[]{1,2,3}");
  • Το χαρακτηριστικό "[[no_unique_address]]" στο οποίο οι μεταβλητές χωρίς δεδομένα δεν καταλαμβάνουν χώρο.
  • Ατομικοί δείκτες (std::atomic > και std::atomic >).
  • Δυνατότητα κλήσης εικονικών συναρτήσεων σε παραστάσεις υπό όρους.
  • Υποστήριξη για άμεσες συναρτήσεις που μπορούν να λειτουργήσουν μόνο με σταθερές.

    consteval int sqr(int n) {
    επιστροφή n * n;
    }

    constexpr int r = sqr(100); // ΕΝΤΑΞΕΙ
    int x = 100.
    int r2 = sqr(x); // ERROR: Το 'x' δεν μπορεί να χρησιμοποιηθεί ως σταθερά

  • Δυνατότητα χρήσης constexpr με εικονικές συναρτήσεις (“constexpr virtual int f() const { return 2; }”).
  • Στην τυπική βιβλιοθήκη:
    • Προστέθηκε υποστήριξη για τον τύπο char8_t για χορδές UTF-8.
    • Προστέθηκε bit αρχείων κεφαλίδας (λειτουργίες bit) και έκδοση.
    • Είναι πλέον δυνατό να ελέγξετε το πρόθεμα και το επίθημα των συμβολοσειρών (αρχίζει_με, τελειώνει_με).
    • Προστέθηκαν χαρακτηριστικά 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 { κόκκινο, πράσινο, μπλε, άλφα };

    std::string_view to_string(rgba_color_channel my_channel) {
    διακόπτης (my_channel) {
    χρησιμοποιώντας enum rgba_color_channel.
    περίπτωση κόκκινο: επιστροφή "κόκκινο"?
    πράσινη θήκη: επιστροφή "πράσινη"?
    θήκη μπλε: επιστροφή "μπλε"?
    περίπτωση άλφα: επιστροφή "άλφα"?
    }
    }

  • Σε ευρετήρια, λόγω απροσδιόριστης συμπεριφοράς, απαγορεύεται η χρήση της λειτουργίας “,” (“a[b,c]”). Η υποστήριξη για τις περισσότερες λειτουργίες με μεταβλητές που δηλώνονται με τη λέξη-κλειδί πτητική έχει διακοπεί, συμπεριλαμβανομένων των λειτουργιών «++» και «—» με τυπικούς τύπους.
  • Μείωσε τον αριθμό των καταστάσεων στις οποίες απαιτείται "όνομα τύπου" για να υποδείξει την παρουσία ενός τύπου.

Πηγή: opennet.ru

Αγοράστε αξιόπιστη φιλοξενία για ιστότοπους με προστασία DDoS, διακομιστές VPS VDS 🔥 Αγοράστε αξιόπιστη φιλοξενία ιστοσελίδων με προστασία DDoS, διακομιστές VPS VDS | ProHoster