Jak dowiedzieć się, jakie funkcje wygenerował kompilator?

11

Wiem o funkcjach generowanych przez kompilator, regule trzech i regule pięciu. W scenariuszach rzeczywistych może nie być trywialne ustalenie, które z funkcji generowanych przez kompilator (konstruktory, operatory przypisania, destruktor) faktycznie zostały utworzone przez kompilator.

Czy jest jakiś sposób, aby wyświetlić listę funkcji generowanych przez kompilator dla określonej klasy?

Interesuje mnie przede wszystkim Visual Studio 2019 i Xcode, ale ogólne rozwiązanie byłoby jeszcze bardziej mile widziane.

Helge Klein
źródło

Odpowiedzi:

11

Zasady są skomplikowane. Ukradnę inną odpowiedź, która cytuje tabelę z prezentacji Howarda Hinnanta .

wprowadź opis zdjęcia tutaj

Morał polega na tym, że dobrą praktyką jest nie poleganie na niejawnych deklaracjach kompilatora i jawne deklarowanie każdego specjalnego członka (domyślnie lub usuniętego, w zależności od potrzeb)

bolov
źródło
Jeśli jawnie zadeklarujesz każdego członka specjalnego, stracisz status członka „nie zadeklarowanego” członka specjalnego dla konstruktora przenoszenia i operatora przypisania.
Maxim Egorushkin
@MaximEgorushkin, moim celem jest zadeklarowanie ich jako domyślnych, jeśli ich potrzebujesz (chociaż domyślny może nadal oznaczać, że nie został zadeklarowany) lub usunięcia, jeśli ich nie chcesz.
bolov
2
@bolov Wykres jest przydatny, ale to nie odpowiada na moje pytanie. Chcę dowiedzieć się, które funkcje zostały wygenerowane przez kompilator. Innymi słowy: nie pytam o to, co powinno się stać w teorii, ale o to, co dzieje się w praktyce.
Helge Klein
1
@ tjwrona1992: Dzięki temu argumentowi nigdy nie musielibyśmy testować naszego kodu, ponieważ wiedzielibyśmy, że jeśli kompilator zrobiłby coś innego niż zamierzaliśmy, musiałby to być błąd.
ruakh
1
@ tjwrona1992: Tak, dokładnie. Podobnie, celem sprawdzenia, co wygenerował Twój kompilator, nie jest sprawdzenie, czy kompilator jest poprawny, ale sprawdzenie, czy podałeś kompilatorowi prawidłowe dane wejściowe.
ruakh
7

„Czy jest jakiś sposób, aby wyświetlić listę funkcji generowanych przez kompilator dla określonej klasy?”

Oczywiście że tak. W Linuksie (i innych systemach uniksowych) możesz użyć nm, readelfa objdumpna wygenerowanych obiektowych plikach / bibliotekach / plikach wykonywalnych, aby je zdemontować i sprawdzić wyeksportowane symbole (i wiele więcej).

Wiem, że istnieją podobne narzędzia w systemie Windows , ale nie jest to platforma, z którą dużo pracuję, więc niestety nie mogę tam podać dokładnych nazw narzędzi.

Jesper Juhl
źródło
1
Chociaż narzędzia te mogą nie pokazywać, jakie funkcje mogły zostać wygenerowane (tj. Kompilator mógł je wygenerować, ale nigdy nie używałeś tych funkcji, więc postanowiłem nie zawracać sobie głowy lub eliminacja kodu łącza została usunięta)
JMAA
@JMAA W większości przypadków „dozwolone generowanie, ale nigdy nie używane” w standardowych warunkach oznaczałoby, że funkcja została „domyślnie zadeklarowana”, ale nie została „domyślnie zdefiniowana”. Tak, nadal oznacza to, że nie zobaczysz symboli, nawet jeśli wstawianie jest wyłączone.
aschepler
1
Ściśle mówiąc, ta odpowiedź bardziej precyzyjnie odpowiada na zadane pytanie: „Jakie metody wygenerował kompilator?” To nie to samo, co o wiele mniej precyzyjne pytanie „Które metody mogły zostać wygenerowane przez kompilator w innym kontekście?”
rici
@rici True. Ale na bardziej precyzyjne pytanie nie można łatwo odpowiedzieć, więc wybrałem to, na co można odpowiedzieć. Nie wahaj się głosować, jeśli uważasz, że moja odpowiedź nie jest cenna.
Jesper Juhl
1
@jesper: nie, już głosowałem. Myślę, że pytanie, na które odpowiedziałeś, jest bardziej precyzyjne, jak powiedziałem. Drugie pytanie, które mogło być zamierzone, wymaga pewnego ręcznego przemyślenia, ponieważ jest kontemplacyjne: nie wiemy, jakie konteksty hipotetyczne mogą obejmować. Ale to jest pytanie dosłownie zadane, celowo lub nie, więc pochwały za udzielenie odpowiedzi.
rici
1

To jest obecnie tylko częściowa odpowiedź.

Visual Studio 2019

Konstruktory

Podczas definiowania obiektu klasy funkcja IntelliSense programu Visual Studio pokazuje dostępne konstruktory, zarówno generowane przez kompilator, jak i własne:

wprowadź opis zdjęcia tutaj

Ta informacja niestety nie zawsze się pojawia. Aby uruchomić powyższy zrzut ekranu, musiałem wpisać coś w nawiasach, stąd przecinek.

Helge Klein
źródło