Przeciążenia, specjalizacje i wyszukiwanie nazw w C++

tech • 360 słów • 2 minuty czytania

Ta notatka została oznaczona jako wymagająca dopracowania: rozwiniecie tresci.
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:

  1. Dokładne dopasowanie (z ewentualną trywialną/prostą konwersją)
  2. Dopasowanie z promocją
  3. Dopasowanie z konwersją standardową
  4. Dopasowanie z konwersją zdefiniowana przez użytkownika
  5. Dopasowanie z wielokropkiem w deklaracji funkcji

[ciag dalszy w przygotowaniu…]


Przypisy

  1. Autorem tego diagramu jest Jeff Preshing, został on opublikowany na jego blogu w artykule “How C++ Resolves a Function Call”. ↩︎

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/