Как узнать, какие функции генерирует компилятор?

11

Я знаю о сгенерированных компилятором функциях, правило трех и правило пяти. В реальных сценариях может оказаться нетривиальным выяснить, какие именно функции, сгенерированные компилятором (конструкторы, операторы присваивания, деструктор) были фактически созданы компилятором.

Есть ли способ перечислить сгенерированные компилятором функции для определенного класса?

Меня в первую очередь интересуют Visual Studio 2019 и Xcode, но общее решение было бы еще более желанным.

Хельге Кляйн
источник

Ответы:

11

Правила сложны. Я украду из другого ответа, который цитирует таблицу из презентации Говарда Хиннанта .

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

Мораль здесь заключается в том, что хорошей практикой является не полагаться на неявное объявление компилятора и явное объявление каждого специального члена (как дефолтного или удаленного, в зависимости от ваших потребностей).

Болов
источник
Если вы явно объявляете каждого специального члена, вы теряете статус «не объявленного» специального члена для конструктора перемещения и оператора присваивания.
Максим Егорушкин
@MaximEgorushkin Моя цель - объявить их дефолтными, если они вам нужны (хотя по умолчанию это может означать, что они не объявлены) или удалить их, если они вам не нужны.
Болов
2
@bolov График полезен, но это не отвечает на мой вопрос. Я хочу выяснить, какие функции были фактически сгенерированы компилятором. Другими словами: я спрашиваю не о том, что должно происходить в теории, а о том, что происходит на практике.
Хельге Кляйн
1
@ tjwrona1992: по этому аргументу нам никогда не понадобится тестировать наш код, потому что мы знаем, что если компилятор делает что-то отличное от того, что мы планировали, то в нем должна быть ошибка.
Руах
1
@ tjwrona1992: Да, именно так. Точно так же, суть того, что сгенерировал ваш компилятор, состоит не в том, чтобы убедиться, что компилятор корректен, а в том, чтобы убедиться, что вы предоставили компилятору правильный ввод.
Руах
7

«Есть ли способ перечислить сгенерированные компилятором функции для определенного класса?»

Конечно, есть. В Linux (и других системах Unix) , вы можете использовать nm, readelfи objdumpна сгенерированные объектные файлы / библиотеки / исполняемым разобрать их и проверять любые экспортируемые символы (и многое другое).

Я знаю, что в Windows есть похожие инструменты , но я работаю не с такой платформой, поэтому, к сожалению, я не могу назвать точные названия инструментов.

Джеспер Юль
источник
1
Хотя эти инструменты вполне могут не показать вам, какие функции могли быть сгенерированы (т. Е. Компилятору было разрешено генерировать их, но вы никогда не использовали эти функции, поэтому решили не беспокоиться, или устранение кода во время компоновки избавилось от них)
JMAA
@JMAA В большинстве случаев «разрешено генерировать, но никогда не использовать» в стандартных терминах означало бы, что функция была «неявно объявлена», но не была «неявно определена». Да, это все еще означает, что вы не увидите символы, даже если встраивание отключено.
aschepler
1
Строго говоря, этот ответ более точно отвечает на заданный вопрос: «Какие методы сгенерировал компилятор?» Это не то же самое, что гораздо менее точный вопрос "Какие методы могли быть сгенерированы компилятором в другом контексте?"
Ричи
@rici Правда. Но более точный вопрос не так легко ответить, поэтому я пошел на то, что можно было ответить. Не стесняйтесь понижать голос, если считаете, что мой ответ не имеет ценности.
Джеспер Юл
1
@jesper: нет, я уже проголосовал. Я думаю, что вопрос, на который вы ответили, является более точным, как я уже сказал. Другой вопрос, который, возможно, и был намерением, требует некоторых действий, потому что это противоречиво: мы не знаем, к каким гипотетическим контекстам это может быть. Но этот вопрос буквально задан, намеренно или нет, так что слава за ответ.
Ричи
1

В настоящее время это только частичный ответ.

Visual Studio 2019

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

При определении объекта класса функция IntelliSense в Visual Studio отображает доступные конструкторы, как сгенерированные компилятором, так и ваши собственные:

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

Эта информация не всегда всплывает, к сожалению. Чтобы заставить его работать на скриншоте выше, мне нужно было что-то напечатать в скобках, отсюда и запятая.

Хельге Кляйн
источник