C++ Ρωσία: πώς συνέβη

Εάν στην αρχή του παιχνιδιού πείτε ότι υπάρχει κώδικας C++ στον τοίχο, τότε στο τέλος είναι βέβαιο ότι θα σας πυροβολήσει στο πόδι.

Bjarne Stroustrup

Από τις 31 Οκτωβρίου έως την 1η Νοεμβρίου, πραγματοποιήθηκε το συνέδριο C++ Russia Piter στην Αγία Πετρούπολη - ένα από τα μεγάλης κλίμακας συνέδρια προγραμματισμού στη Ρωσία, που διοργανώθηκε από την JUG Ru Group. Οι προσκεκλημένοι ομιλητές περιλαμβάνουν μέλη της Επιτροπής Προτύπων C++, ομιλητές CppCon, συγγραφείς βιβλίων O'Reilly και συντηρητές έργων όπως το LLVM, το libc++ και το Boost. Το συνέδριο απευθύνεται σε έμπειρους προγραμματιστές C++ που θέλουν να εμβαθύνουν την τεχνογνωσία τους και να ανταλλάξουν εμπειρίες στη ζωντανή επικοινωνία. Σε φοιτητές, μεταπτυχιακούς φοιτητές και καθηγητές πανεπιστημίου παρέχονται πολύ ωραίες εκπτώσεις.

Η έκδοση του συνεδρίου στη Μόσχα θα είναι διαθέσιμη για επίσκεψη ήδη από τον Απρίλιο του επόμενου έτους, αλλά στο μεταξύ οι μαθητές μας θα σας πουν τι ενδιαφέροντα πράγματα έμαθαν στην τελευταία εκδήλωση. 

C++ Ρωσία: πώς συνέβη

Φωτογραφία από λεύκωμα συνεδρίου

Σχετικά με εμάς

Δύο φοιτητές από την Ανώτατη Οικονομική Σχολή του Εθνικού Ερευνητικού Πανεπιστημίου - Αγία Πετρούπολη εργάστηκαν σε αυτήν τη θέση:

  • Η Liza Vasilenko είναι προπτυχιακή φοιτήτρια 4ου έτους που σπουδάζει Γλώσσες Προγραμματισμού ως μέρος του προγράμματος Εφαρμοσμένων Μαθηματικών και Επιστήμης Υπολογιστών. Έχοντας εξοικειωθεί με τη γλώσσα C++ στο πρώτο έτος στο πανεπιστήμιο, απέκτησα στη συνέχεια εμπειρία δουλεύοντας μαζί της μέσω πρακτικής άσκησης στον κλάδο. Το πάθος μου για τις γλώσσες προγραμματισμού γενικά και τον λειτουργικό προγραμματισμό ειδικότερα άφησε το στίγμα του στην επιλογή των αναφορών στο συνέδριο.
  • Η Danya Smirnov είναι φοιτήτρια 1ου έτους του μεταπτυχιακού προγράμματος "Προγραμματισμός και Ανάλυση Δεδομένων". Ενώ ήμουν ακόμη στο σχολείο, έγραψα προβλήματα Ολυμπιάδας σε C++ και μετά κατά κάποιο τρόπο συνέβη η γλώσσα να εμφανιζόταν συνεχώς σε εκπαιδευτικές δραστηριότητες και τελικά να γίνει η κύρια γλώσσα εργασίας. Αποφάσισα να συμμετάσχω στο συνέδριο για να βελτιώσω τις γνώσεις μου και επίσης να μάθω για νέες ευκαιρίες.

Στο ενημερωτικό δελτίο, η ηγεσία της σχολής μοιράζεται συχνά πληροφορίες σχετικά με εκπαιδευτικές εκδηλώσεις που σχετίζονται με την ειδικότητά μας. Τον Σεπτέμβριο είδαμε πληροφορίες για τη C++ Ρωσία και αποφασίσαμε να εγγραφούμε ως ακροατές. Αυτή είναι η πρώτη μας εμπειρία από τη συμμετοχή σε τέτοια συνέδρια.

Δομή συνεδρίου

  • Αναφορές

Κατά τη διάρκεια δύο ημερών, οι ειδικοί διάβασαν 30 αναφορές, που καλύπτουν πολλά καυτά θέματα: έξυπνες χρήσεις γλωσσικών χαρακτηριστικών για την επίλυση εφαρμοσμένων προβλημάτων, επερχόμενες ενημερώσεις γλώσσας σε σχέση με το νέο πρότυπο, συμβιβασμούς στη σχεδίαση C++ και προφυλάξεις κατά την επεξεργασία των συνεπειών τους, παραδείγματα ενδιαφέρουσα αρχιτεκτονική του έργου, καθώς και κάποιες λεπτομέρειες της γλωσσικής υποδομής κάτω από το καπό. Τρεις παραστάσεις πραγματοποιήθηκαν ταυτόχρονα, τις περισσότερες φορές δύο στα ρωσικά και μία στα αγγλικά.

  • Ζώνες συζήτησης

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

  • Αστραπιαία συνομιλίες και άτυπες συζητήσεις

Εάν θέλετε να δώσετε μια σύντομη αναφορά, μπορείτε να εγγραφείτε στον πίνακα για τη βραδινή ομιλία Lightning και να έχετε πέντε λεπτά χρόνο για να μιλήσετε για οτιδήποτε σχετικά με το θέμα του συνεδρίου. Για παράδειγμα, μια γρήγορη εισαγωγή στα απολυμαντικά για C++ (για κάποιους ήταν καινούργιο) ή μια ιστορία σχετικά με ένα σφάλμα στη δημιουργία ημιτονοειδών κυμάτων που μπορεί να ακούγεται μόνο, αλλά δεν μπορεί να δει.

Μια άλλη μορφή είναι η συζήτηση στο πάνελ «Με επιτροπή από καρδιάς σε καρδιά». Στη σκηνή είναι μερικά μέλη της επιτροπής τυποποίησης, στον προβολέα είναι ένα τζάκι (επίσημα - για να δημιουργηθεί μια ειλικρινής ατμόσφαιρα, αλλά ο λόγος "γιατί ΟΛΑ ΕΙΝΑΙ ΦΩΤΙΑ" φαίνεται πιο αστείος), ερωτήσεις σχετικά με το πρότυπο και το γενικό όραμα της C++ , χωρίς έντονες τεχνικές συζητήσεις και holiwars. Αποδείχθηκε ότι η επιτροπή περιέχει επίσης ζωντανούς ανθρώπους που μπορεί να μην είναι απολύτως σίγουροι για κάτι ή να μην γνωρίζουν κάτι.

Για τους λάτρεις των holivars, το τρίτο γεγονός παρέμεινε στην υπόθεση - η συνεδρία BOF "Go vs. C++". Παίρνουμε έναν Go lover, έναν λάτρη της C++, πριν από την έναρξη της συνεδρίας ετοιμάζουν μαζί 100500 διαφάνειες για ένα θέμα (όπως προβλήματα με πακέτα σε C++ ή έλλειψη γενικών στο Go), και στη συνέχεια έχουν μια ζωηρή συζήτηση μεταξύ τους και με το κοινό και το κοινό προσπαθεί να κατανοήσει δύο απόψεις ταυτόχρονα . Εάν ένα holivar ξεκινά εκτός πλαισίου, ο συντονιστής παρεμβαίνει και συμφιλιώνει τα μέρη. Αυτή η μορφή είναι εθιστική: αρκετές ώρες μετά την έναρξη, ολοκληρώθηκαν μόνο οι μισές διαφάνειες. Το τέλος έπρεπε να επιταχυνθεί πολύ.

  • Στάσεις συνεργατών

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

Τεχνικές λεπτομέρειες των εκθέσεων

Ακούσαμε αναφορές και τις δύο μέρες. Μερικές φορές ήταν δύσκολο να επιλέξουμε μία αναφορά από τις παράλληλες - συμφωνήσαμε να χωρίσουμε και να ανταλλάξουμε τη γνώση που αποκτήσαμε στα διαλείμματα. Και ακόμα κι έτσι, φαίνεται ότι πολλά έχουν μείνει έξω. Εδώ θα θέλαμε να μιλήσουμε για το περιεχόμενο ορισμένων εκθέσεων που βρήκαμε πιο ενδιαφέρουσες

Εξαιρέσεις στη C++ μέσα από το πρίσμα των βελτιστοποιήσεων μεταγλωττιστή, Roman Rusyaev

C++ Ρωσία: πώς συνέβη
Σύρετε από презентации

Όπως υποδηλώνει ο τίτλος, ο Roman εξέτασε την εργασία με εξαιρέσεις χρησιμοποιώντας το LLVM ως παράδειγμα. Ταυτόχρονα, για όσους δεν χρησιμοποιούν το Clang στην εργασία τους, η αναφορά μπορεί ακόμα να δώσει κάποια ιδέα για το πώς θα μπορούσε ενδεχομένως να βελτιστοποιηθεί ο κώδικας. Αυτό συμβαίνει επειδή οι προγραμματιστές μεταγλωττιστών και οι αντίστοιχες τυπικές βιβλιοθήκες επικοινωνούν μεταξύ τους και πολλές επιτυχημένες λύσεις μπορεί να συμπέσουν.

Έτσι, για να χειριστείτε μια εξαίρεση, πρέπει να κάνετε πολλά πράγματα: καλέστε τον κωδικό χειρισμού (εάν υπάρχει) ή δωρεάν πόρους στο τρέχον επίπεδο και περιστρέψτε τη στοίβα ψηλότερα. Όλα αυτά οδηγούν στο γεγονός ότι ο μεταγλωττιστής προσθέτει πρόσθετες οδηγίες για κλήσεις που ενδεχομένως δημιουργούν εξαιρέσεις. Επομένως, εάν η εξαίρεση δεν τεθεί στην πραγματικότητα, το πρόγραμμα θα εξακολουθεί να εκτελεί περιττές ενέργειες. Προκειμένου να μειώσει κατά κάποιο τρόπο τα γενικά έξοδα, το LLVM διαθέτει αρκετά ευρετικά εργαλεία για τον προσδιορισμό καταστάσεων όπου δεν χρειάζεται να προστεθεί κώδικας χειρισμού εξαιρέσεων ή μπορεί να μειωθεί ο αριθμός των «επιπλέον» εντολών.

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

Έτσι, ο Roman Rusyaev οδηγεί τους μαθητές στο συμπέρασμα ότι ο κώδικας που περιέχει τον χειρισμό εξαιρέσεων δεν μπορεί πάντα να εκτελεστεί με μηδενικό γενικό κόστος και δίνει τις ακόλουθες συμβουλές:

  • Κατά την ανάπτυξη βιβλιοθηκών, αξίζει καταρχήν να εγκαταλείψουμε τις εξαιρέσεις.
  • αν εξακολουθούν να χρειάζονται εξαιρέσεις, τότε όποτε είναι δυνατόν, αξίζει να προσθέτετε noexcept (και const) τροποποιητές παντού, έτσι ώστε ο μεταγλωττιστής να μπορεί να βελτιστοποιήσει όσο το δυνατόν περισσότερο.

Σε γενικές γραμμές, ο ομιλητής επιβεβαίωσε την άποψη ότι οι εξαιρέσεις είναι καλύτερο να χρησιμοποιούνται στο ελάχιστο ή να εγκαταλείπονται εντελώς.

Οι διαφάνειες της αναφοράς είναι διαθέσιμες στον παρακάτω σύνδεσμο: ["Εξαιρέσεις C++ μέσω του φακού των βελτιστοποιήσεων μεταγλωττιστή LLVM"]

Γεννήτριες, κορουτίνες και άλλη γλυκύτητα που ξετυλίγει τον εγκέφαλο, Adi Shavit

C++ Ρωσία: πώς συνέβη
Σύρετε από презентации

Μία από τις πολλές εκθέσεις σε αυτό το συνέδριο αφιερωμένη στις καινοτομίες στην C++20 ήταν αξιομνημόνευτη όχι μόνο για την πολύχρωμη παρουσίασή της, αλλά και για τη σαφή αναγνώριση των υφιστάμενων προβλημάτων με τη λογική επεξεργασίας συλλογής (για βρόχο, επανακλήσεις).

Ο Adi Shavit τονίζει τα εξής: οι επί του παρόντος διαθέσιμες μέθοδοι περνούν από ολόκληρη τη συλλογή και δεν παρέχουν πρόσβαση σε κάποια εσωτερική ενδιάμεση κατάσταση (ή παρέχουν στην περίπτωση επανάκλησης, αλλά με μεγάλο αριθμό δυσάρεστων παρενεργειών, όπως το Callback Hell) . Φαίνεται ότι υπάρχουν επαναλήπτες, αλλά ακόμη και με αυτούς δεν είναι όλα τόσο ομαλά: δεν υπάρχουν κοινά σημεία εισόδου και εξόδου (αρχή → τέλος έναντι rbegin → rend και ούτω καθεξής), δεν είναι σαφές πόσο καιρό θα επαναλαμβάνουμε; Ξεκινώντας με την C++20, αυτά τα προβλήματα λύνονται!

Πρώτη επιλογή: σειρές. Αναδιπλώνοντας επαναλήπτες, λαμβάνουμε μια κοινή διεπαφή για την αρχή και το τέλος μιας επανάληψης, και έχουμε επίσης τη δυνατότητα σύνθεσης. Όλα αυτά διευκολύνουν τη δημιουργία ολοκληρωμένων αγωγών επεξεργασίας δεδομένων. Αλλά δεν είναι όλα τόσο ομαλά: μέρος της λογικής υπολογισμού βρίσκεται μέσα στην υλοποίηση ενός συγκεκριμένου επαναλήπτη, ο οποίος μπορεί να περιπλέξει τον κώδικα για την κατανόηση και τον εντοπισμό σφαλμάτων.

C++ Ρωσία: πώς συνέβη
Σύρετε από презентации

Λοιπόν, για αυτήν την περίπτωση, η C++20 πρόσθεσε κορουτίνες (συναρτήσεις των οποίων η συμπεριφορά είναι παρόμοια με τις γεννήτριες στην Python): η εκτέλεση μπορεί να αναβληθεί επιστρέφοντας κάποια τρέχουσα τιμή διατηρώντας μια ενδιάμεση κατάσταση. Έτσι, επιτυγχάνουμε όχι μόνο να δουλεύουμε με δεδομένα όπως εμφανίζονται, αλλά και να ενσωματώνουμε όλη τη λογική μέσα σε μια συγκεκριμένη κορουτίνα.

Αλλά υπάρχει μια μύγα: αυτή τη στιγμή υποστηρίζονται μόνο εν μέρει από υπάρχοντες μεταγλωττιστές και επίσης δεν υλοποιούνται τόσο προσεκτικά όσο θα θέλαμε: για παράδειγμα, δεν αξίζει ακόμα να χρησιμοποιείτε αναφορές και προσωρινά αντικείμενα στις κορουτίνες. Επιπλέον, υπάρχουν ορισμένοι περιορισμοί σχετικά με το τι μπορεί να είναι κορουτίνες και οι συναρτήσεις constexpr, οι κατασκευαστές/καταστροφείς και οι κύριες δεν περιλαμβάνονται σε αυτήν τη λίστα.

Έτσι, οι κορουτίνες λύνουν ένα σημαντικό μέρος των προβλημάτων με την απλότητα της λογικής επεξεργασίας δεδομένων, αλλά οι τρέχουσες υλοποιήσεις τους απαιτούν βελτίωση.

Υλικά:

Κόλπα C++ από Yandex.Taxi, Anton Polukhin

Στις επαγγελματικές μου δραστηριότητες, μερικές φορές πρέπει να εφαρμόσω καθαρά βοηθητικά πράγματα: ένα περιτύλιγμα μεταξύ της εσωτερικής διεπαφής και του API κάποιας βιβλιοθήκης, καταγραφή ή ανάλυση. Σε αυτήν την περίπτωση, συνήθως δεν χρειάζεται καμία πρόσθετη βελτιστοποίηση. Τι γίνεται όμως αν αυτά τα στοιχεία χρησιμοποιούνται σε μερικές από τις πιο δημοφιλείς υπηρεσίες στο RuNet; Σε μια τέτοια κατάσταση, θα πρέπει να επεξεργάζεστε terabytes ανά ώρα κούτσουρων μόνο! Τότε κάθε χιλιοστό του δευτερολέπτου μετράει και επομένως πρέπει να καταφύγετε σε διάφορα κόλπα - ο Anton Polukhin μίλησε για αυτά.

Ίσως το πιο ενδιαφέρον παράδειγμα ήταν η υλοποίηση του μοτίβου pointer-to-implementation (pimpl). 

#include <third_party/json.hpp> //PROBLEMS! 
struct Value { 
    Value() = default; 
    Value(Value&& other) = default; 
    Value& operator=(Value&& other) = default; 
    ~Value() = default; 

    std::size_t Size() const { return data_.size(); } 

private: 
    third_party::Json data_; 
};

Σε αυτό το παράδειγμα, πρώτα θέλω να απαλλαγώ από τα αρχεία κεφαλίδας των εξωτερικών βιβλιοθηκών - αυτό θα μεταγλωττιστεί πιο γρήγορα και μπορείτε να προστατευθείτε από πιθανές διενέξεις ονομάτων και άλλα παρόμοια σφάλματα. 

Εντάξει, μεταφέραμε το #include στο αρχείο .cpp: χρειαζόμαστε μια δήλωση προς τα εμπρός του περιτυλιγμένου API, καθώς και το std::unique_ptr. Τώρα έχουμε δυναμικές κατανομές και άλλα δυσάρεστα πράγματα, όπως δεδομένα διάσπαρτα σε μια δέσμη δεδομένων και μειωμένες εγγυήσεις. Το std::aligned_storage μπορεί να βοηθήσει σε όλα αυτά. 

struct Value { 
// ... 
private: 
    using JsonNative = third_party::Json; 
    const JsonNative* Ptr() const noexcept; 
    JsonNative* Ptr() noexcept; 

    constexpr std::size_t kImplSize = 32; 
    constexpr std::size_t kImplAlign = 8; 
    std::aligned_storage_t<kImplSize, kImplAlign> data_; 
};

Το μόνο πρόβλημα: πρέπει να καθορίσετε το μέγεθος και την ευθυγράμμιση για κάθε περιτύλιγμα - ας φτιάξουμε το πρότυπο pimpl με παραμέτρους , χρησιμοποιήστε κάποιες αυθαίρετες τιμές και προσθέστε μια επιταγή στον καταστροφέα ότι τα έχουμε όλα σωστά: 

~FastPimpl() noexcept { 
    validate<sizeof(T), alignof(T)>(); 
    Ptr()->~T(); 
}

template <std::size_t ActualSize, std::size_t ActualAlignment>
static void validate() noexcept { 
    static_assert(
        Size == ActualSize, 
        "Size and sizeof(T) mismatch"
    ); 
    static_assert(
        Alignment == ActualAlignment, 
        "Alignment and alignof(T) mismatch"
    ); 
}

Δεδομένου ότι το T έχει ήδη οριστεί κατά την επεξεργασία του καταστροφέα, αυτός ο κωδικός θα αναλυθεί σωστά και στο στάδιο της μεταγλώττισης θα εξάγει το απαιτούμενο μέγεθος και τις τιμές ευθυγράμμισης που πρέπει να εισαχθούν ως σφάλματα. Έτσι, με το κόστος μιας πρόσθετης εκτέλεσης μεταγλώττισης, απαλλαγούμε από τη δυναμική κατανομή των τυλιγμένων κλάσεων, αποκρύπτουμε το API σε ένα αρχείο .cpp με την υλοποίηση και λαμβάνουμε επίσης ένα σχέδιο που είναι πιο κατάλληλο για αποθήκευση στην κρυφή μνήμη από τον επεξεργαστή.

Η καταγραφή και η ανάλυση φαινόταν λιγότερο εντυπωσιακή και επομένως δεν θα αναφερθούν σε αυτήν την ανασκόπηση.

Οι διαφάνειες της αναφοράς είναι διαθέσιμες στον παρακάτω σύνδεσμο: ["Κόλπα C++ από το Taxi"]

Σύγχρονες τεχνικές για τη διατήρηση του κωδικού σας DRY, Björn Fahler

Σε αυτήν την ομιλία, ο Björn Fahler δείχνει αρκετούς διαφορετικούς τρόπους για να καταπολεμήσετε το στιλιστικό ελάττωμα των επαναλαμβανόμενων ελέγχων κατάστασης:

assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);

Ακούγεται οικείο? Χρησιμοποιώντας πολλές ισχυρές τεχνικές C++ που εισήχθησαν στα πρόσφατα πρότυπα, μπορείτε να εφαρμόσετε κομψά την ίδια λειτουργικότητα χωρίς καμία ποινή απόδοσης. Συγκρίνω:   

assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));

Για να χειριστείτε έναν απροσδιόριστο αριθμό ελέγχων, πρέπει αμέσως να χρησιμοποιήσετε μεταβλητά πρότυπα και εκφράσεις διπλώματος. Ας υποθέσουμε ότι θέλουμε να ελέγξουμε την ισότητα πολλών μεταβλητών με το στοιχείο state_type του enum. Το πρώτο πράγμα που έρχεται στο μυαλό είναι να γράψετε μια βοηθητική συνάρτηση is_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) { 
    return ((s == ts) || ...); 
}

Αυτό το ενδιάμεσο αποτέλεσμα είναι απογοητευτικό. Μέχρι στιγμής ο κώδικας δεν γίνεται πιο ευανάγνωστος:

assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); 

Οι παράμετροι προτύπου που δεν είναι τύπου θα βοηθήσουν να βελτιωθεί λίγο η κατάσταση. Με τη βοήθειά τους, θα μεταφέρουμε τα αναρίθμητα στοιχεία του enum στη λίστα των παραμέτρων προτύπου: 

template <state_type ... states>
bool is_any_of(state_type t) { 
    return ((t == states) | ...); 
}
	
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); 

Χρησιμοποιώντας το auto σε μια παράμετρο προτύπου μη τύπου (C++17), η προσέγγιση γενικεύεται απλώς σε συγκρίσεις όχι μόνο με στοιχεία state_type, αλλά και με πρωτόγονους τύπους που μπορούν να χρησιμοποιηθούν ως παράμετροι προτύπου μη τύπου:


template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
    return ((t == alternatives) | ...);
}

Μέσω αυτών των διαδοχικών βελτιώσεων, επιτυγχάνεται η επιθυμητή ευχάριστη σύνταξη για τους ελέγχους:


template <class ... Ts>
struct any_of : private std::tuple<Ts ...> { 
// поленимся и унаследуем конструкторы от tuple 
        using std::tuple<Ts ...>::tuple;
        template <typename T>
        bool operator ==(const T& t) const {
                return std::apply(
                        [&t](const auto& ... ts) {
                                return ((ts == t) || ...);
                        },
                        static_cast<const std::tuple<Ts ...>&>(*this));
        }
};

template <class ... Ts>
any_of(Ts ...) -> any_of<Ts ... >;
 
assert(any_of(IDLE, DISCONNECTING, DISCONNECTED) == state);

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

Περαιτέρω - πιο ενδιαφέρον. Ο Bjorn διδάσκει πώς να γενικεύετε τον κώδικα που προκύπτει για τελεστές σύγκρισης πέρα ​​από το ==, και στη συνέχεια για αυθαίρετες πράξεις. Στην πορεία, χαρακτηριστικά όπως το χαρακτηριστικό no_unique_address (C++20) και οι παράμετροι προτύπου στις συναρτήσεις λάμδα (C++20) εξηγούνται χρησιμοποιώντας παραδείγματα χρήσης. (Ναι, τώρα η σύνταξη λάμδα είναι ακόμα πιο εύκολο να θυμηθείς - αυτά είναι τέσσερα διαδοχικά ζεύγη παρενθέσεων όλων των ειδών.) Η τελική λύση που χρησιμοποιεί λειτουργίες ως λεπτομέρειες κατασκευής ζεσταίνει πραγματικά την ψυχή μου, για να μην αναφέρουμε την έκφραση πλειάδα στις καλύτερες παραδόσεις του λάμδα λογισμός.

Στο τέλος, μην ξεχάσετε να το γυαλίσετε:

  • Να θυμάστε ότι τα λάμδα είναι constexpr δωρεάν. 
  • Ας προσθέσουμε τέλεια προώθηση και ας δούμε την άσχημη σύνταξη σε σχέση με το πακέτο παραμέτρων στο κλείσιμο λάμδα.
  • Ας δώσουμε στον μεταγλωττιστή περισσότερες ευκαιρίες για βελτιστοποιήσεις με το noexcept υπό όρους. 
  • Ας φροντίσουμε για πιο κατανοητή έξοδο σφαλμάτων στα πρότυπα χάρη στις σαφείς τιμές επιστροφής των lambdas. Αυτό θα αναγκάσει τον μεταγλωττιστή να κάνει περισσότερους ελέγχους πριν από την πραγματική κλήση της συνάρτησης προτύπου - στο στάδιο ελέγχου τύπου. 

Για λεπτομέρειες, ανατρέξτε στο υλικό της διάλεξης: 

Οι εντυπώσεις μας

Η πρώτη μας συμμετοχή στη C++ Ρωσία έμεινε αξέχαστη για την έντασή της. Έλαβα την εντύπωση της C++ Ρωσίας ως ένα ειλικρινές γεγονός, όπου η γραμμή μεταξύ εκπαίδευσης και ζωντανής επικοινωνίας είναι σχεδόν ανεπαίσθητη. Τα πάντα, από τη διάθεση των ομιλητών μέχρι τους διαγωνισμούς από τους συνεργάτες της εκδήλωσης, ευνοούν τις έντονες συζητήσεις. Το περιεχόμενο του συνεδρίου, που αποτελείται από εκθέσεις, καλύπτει ένα αρκετά ευρύ φάσμα θεμάτων, συμπεριλαμβανομένων καινοτομιών C++, περιπτωσιολογικών μελετών μεγάλων έργων και ιδεολογικών αρχιτεκτονικών προβληματισμών. Αλλά θα ήταν άδικο να αγνοήσουμε το κοινωνικό στοιχείο του συμβάντος, το οποίο βοηθά να ξεπεραστούν τα γλωσσικά εμπόδια σε σχέση όχι μόνο με τη C++.

Ευχαριστούμε τους διοργανωτές του συνεδρίου για την ευκαιρία να συμμετάσχουμε σε μια τέτοια εκδήλωση!
Ίσως έχετε δει την ανάρτηση των διοργανωτών σχετικά με το παρελθόν, το παρόν και το μέλλον της C++ Ρωσίας στο ιστολόγιο JUG Ru.

Ευχαριστούμε για την ανάγνωση και ελπίζουμε ότι η επανάληψη των γεγονότων ήταν χρήσιμη!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο