Przeciążenia, specjalizacje i wyszukiwanie nazw w C++
• tech • 359 słów • 2 minuty czytania
Ta notatka została oznaczona jako wymagająca dopracowania: treść w przygotowaniu.
Zawartość wpisu może ulec zmianie, zatem zapraszam do ponownych odwiedzin w niedalekiej przyszłości :)
Po ostatnim wpisie, gdzie w przedstawionych sposobach w wielu miejscach bazowałem głównie na możliwościach oferowanych przez przeciążenia funkcji i specjalizacje, dalej chciałbym poruszyć te ciekawe elementy i mechanizmy języka C++ jakimi bez wątpienia są właśnie przeciążania i specjalizacje, a także cały mechanizm wyszukiwania nazw.
Ten obszar języka C++ wydaje się trochę skomplikowany, o czym może poświadczyć objętość materiału go opisującego. W dokumencie standaryzacyjnym języka C++ znajdziemy całe rozdziały o przeciążeniach ([over]), wyszukiwaniu nazw ([basic.lookup]) i powiązanych elementach biorących udział w tym procesie, porozrzucanych w innych miejscach standardu. Podobny ogrom materiałów w bardziej przystępnej formie można znaleźć też na cppreference.com.
Zawiłość tego elementu idealnie odzwierciedla poniższy obrazek1, zapożyczony z artykułu “How C++ Resolves a Function Call”, przedstawiający dokładnie to w jaki sposób kompilator rozwiązuje wywołania i wybiera odpowiednią funkcję.
Bardzo polecam wszystkim ten podlinkowany wyżej artykuł Jeffa. Szczególnie osobom chcącym poznać i zrozumieć cały proces jaki przechodzi kompilator przy napotkaniu wywołania funkcji. Autorowi udało się w ładnie opisać wszystkie etapy pracy kompilatora, począwszy od wyszukiwania odpowiedniej nazwy, aż do wyboru tej najbardziej odpowiedniej funkcji.
I w sumie na tym mógłbym zakończyć ten wpis ;)
Mówiąc szczerze, to właśnie ten artykuł uchronił mnie przed próbą przebrnięcia samemu przez ten temat i nie wiem czy udałoby mi się to w takiej zgrabnej i przystępnej formie zaprezentować. Żeby jednak nie odpuszczać cłkowiecie tej tematyki, powiązanej jakoś z moim ostatnim wpisem, gdzie przeciążenia i specjalizacje grały pierwsze skrzypce, może uda mi się dopowiedzieć kilka ciekawych szczegółów.
Wybieranie odpowiedniej funkcji z listy kandydatów funkcji przeciążonej następuje w celu jak najlepszego dopasowania do argumentów w wywołaniu funkcji. Szukając takich dopasowani, kompilator może skorzystać z niejawnych konwersji, tych standardowych, jak również zdefiniowanych przez użytkownika, wedle ściśle określonego porządku.
Kryteria dopasowana argumentów szczegółowo (i chyba nieco zawile) opisano w standardzie. Do codziennej pracy powinna wystarczyć ogólna wiedza i kolejność stonowania tych reguły, co można przedstawić w takiej uproszczonej formie:
- Dokładne dopasowanie (z ewentualną trywialną/prostą konwersją)
- Dopasowanie z promocją
- Dopasowanie z konwersją standardową
- Dopasowanie z konwersją zdefiniowana przez użytkownika
- Dopasowanie z wielokropkiem w deklaracji funkcji
[ciag dalszy w przygotowaniu…]
Przypisy
-
Autorem tego diagramu jest Jeff Preshing, został on opublikowany na jego blogu w artykule “How C++ Resolves a Function Call”. ↩︎
Komentarze (0)