Як дізнатися, які функції генерував компілятор?


11

Я знаю про функції, створені компілятором, правило три та правило п'ять. У реальних сценаріях може бути неправдивим, щоб точно визначити, які з функцій, створених компілятором (конструктори, оператори присвоєння, деструктор), були створені компілятором.

Чи є якийсь спосіб перерахувати створені компілятором функції для конкретного класу?

Мене насамперед цікавлять Visual Studio 2019 та Xcode, але загальне рішення було б ще приємніше.

Відповіді:


11

Правила складні. Я вкраду з іншої відповіді, яка цитує таблицю з виступу Говарда Гіннанта .

введіть тут опис зображення

Мораль тут полягає в тому, що хороша практика - не покладатися на неявні декларації компілятора і чітко заявляти про кожного спеціального члена (як дефолт або видалений, залежно від ваших потреб)


Якщо ви явно заявляєте про кожного спеціального члена, ви втрачаєте статус "незадекларованих" спеціальних членів для конструктора переміщення та оператора призначення.
Максим Єгорушкін

@MaximEgorushkin, я можу визнати їх дефолтом, якщо вони вам потрібні (хоча за замовчуванням все ще може означати, що не оголошено) або видалити, якщо ви їх не хочете.
болов

2
@bolov Діаграма корисна, але це не відповідає на моє запитання. Я хочу з’ясувати, які функції насправді були створені компілятором. Іншими словами: я не запитую про те, що має відбуватися теоретично, а те, що відбувається на практиці.
Гельге Кляйн

1
@ tjwrona1992: За цим аргументом нам ніколи не потрібно тестувати наш код, тому що ми знаємо, що якщо компілятор зробив щось інше, ніж ми планували, то в ньому має бути помилка.
ruakh

1
@ tjwrona1992: Так, саме так. Крім того, сенс бачити те, що створив ваш компілятор, полягає не в тому, щоб перевірити правильність компілятора, а навпаки, щоб переконатися, що ви надали компілятору правильний ввід.
ruakh

7

"Чи є спосіб перерахувати функції, створені компілятором, для певного класу?"

Звичайно, є. У Linux (та інших системах Unix) ви можете використовувати nm, readelfа також objdumpна створених об'єктних файлах / бібліотеках / виконувані файли для їх розбирання та огляду будь-яких експортованих символів (та багато іншого).

Я знаю подібні інструменти для Windows , але це не платформа, з якою я дуже працюю, тому, на жаль, я не можу назвати точні назви інструментів там.


1
Хоча ці інструменти, можливо, не показують, які функції можуть бути згенеровані (тобто компілятору було дозволено їх генерувати, але ви ніколи не використовували ці функції, тому він вирішив не турбуватись, або усунення коду зв'язку часу позбулося їх)
JMAA

@JMAA У більшості випадків "дозволено генерувати, але ніколи не використовується" в стандартних умовах означало б, що функція "неявно оголошена", але не була "неявно визначена". Так, це все ще означає, що ви не побачите символів, навіть якщо вставку вимкнено.
aschepler

1
Власне кажучи, ця відповідь точніше відповідає на поставлене запитання: "Які методи створив компілятор?" Це не те саме, що набагато менш точне запитання "Які методи може бути сформовано компілятором в іншому контексті?"
rici

@rici Правда. Але на більш точне запитання не можна легко відповісти, тому я пішов на те, що можна було б відповісти. Не соромтеся виступати, якщо ви вважаєте, що моя відповідь не є цінною.
Jesper Juhl

1
@jesper: ні, я вже схвалений. Я думаю, що питання, на яке ви відповіли, є більш точним, як я вже сказав. Інше питання, яке могло бути наміром, вимагає певного рукоділля, оскільки це контрафактично: ми не знаємо, які гіпотетичні контексти це може включати. Але це питання буквально задається, навмисно чи ні, тому кудо за його відповідь.
rici

1

Наразі це лише часткова відповідь.

Візуальна студія 2019

Конструктори

Визначаючи об’єкт класу, функція IntelliSense Visual Studio показує доступні конструктори, як створені компілятором, так і власні:

введіть тут опис зображення

На жаль, ця інформація не завжди з'являється. Щоб він працював на скріншоті вище, мені довелося щось ввести в круглі дужки, отже, і кома.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.