Comment savoir quelles fonctions le compilateur a généré?

11

Je connais les fonctions générées par le compilateur, la règle de trois et la règle de cinq. Dans les scénarios du monde réel, il peut ne pas être trivial de déterminer exactement quelles fonctions générées par le compilateur (constructeurs, opérateurs d'affectation, destructeur) ont été réellement créées par le compilateur.

Existe-t-il un moyen de répertorier les fonctions générées par le compilateur pour une classe spécifique?

Je suis principalement intéressé par Visual Studio 2019 et Xcode, mais une solution générique serait encore plus bienvenue.

Helge Klein
la source

Réponses:

11

Les règles sont compliquées. Je vais voler une autre réponse qui cite un tableau de la présentation de Howard Hinnant .

entrez la description de l'image ici

La morale ici est qu'une bonne pratique est de ne pas s'appuyer sur les déclarations implicites du compilateur et de déclarer explicitement chaque membre spécial (par défaut ou supprimé, selon vos besoins)

bolov
la source
Si vous déclarez explicitement chaque membre spécial, vous perdez le statut de membre spécial "non déclaré" pour le constructeur de déplacement et l'opérateur d'affectation.
Maxim Egorushkin
@MaximEgorushkin mon point est de les déclarer par défaut si vous en avez besoin (bien que par défaut peut toujours signifier non déclaré) ou supprimés si vous ne les voulez pas.
bolov
2
@bolov Le graphique est utile mais cela ne répond pas à ma question. Je veux savoir quelles fonctions ont été réellement générées par le compilateur. En d'autres termes: je ne demande pas ce qui devrait se produire en théorie, mais ce qui se passe dans la pratique.
Helge Klein
1
@ tjwrona1992: Par cet argument, nous n'aurions jamais besoin de tester notre code, car nous saurions que si le compilateur faisait quelque chose de différent de ce que nous voulions, il devait y avoir un bogue.
ruakh
1
@ tjwrona1992: Oui, exactement. De même, le point de voir ce que votre compilateur a généré n'est pas de vérifier que le compilateur est correct, mais plutôt de vérifier que vous avez fourni au compilateur la bonne entrée.
ruakh
7

"Existe-t-il un moyen de répertorier les fonctions générées par le compilateur pour une classe spécifique?"

Bien sûr que oui. Sur Linux (et d' autres systèmes Unix) vous pouvez utiliser nm, readelfet objdumpsur les fichiers objets générés / bibliothèques / exécutable pour les démonter et inspecter tous les symboles exportés (et beaucoup plus).

Il existe des outils similaires sur Windows , je sais, mais ce n'est pas une plate-forme avec laquelle je travaille beaucoup, donc malheureusement je ne peux pas y nommer des noms d'outils exacts.

Jesper Juhl
la source
1
Bien que ces outils vous pouvez montrer très bien ne pas quelles fonctions pourraient avoir été générées ( par exemple, le compilateur a été autorisé à les générer, mais vous n'a jamais utilisé ces fonctions il a décidé de ne pas déranger, ou un code lien temps d' élimination est débarrassé d'eux)
JMAA
@JMAA Dans la plupart des cas, "autorisé à générer mais jamais utilisé" signifierait en termes standard qu'une fonction a été "implicitement déclarée" mais n'a pas été "implicitement définie". Oui, cela signifie toujours que vous ne verrez pas les symboles, même si l'inline est désactivé.
aschepler
1
A strictement parler, cette réponse répond plus précisément à la question posée: "Quelles méthodes le compilateur a-t-il généré?" Ce n'est pas la même chose que la question beaucoup moins précise "Quelles méthodes auraient pu être générées par le compilateur dans un contexte différent?"
rici
@rici True. Mais la question plus précise n'est pas facile à répondre, alors j'ai cherché ce qui pouvait être répondu. N'hésitez pas à voter si vous pensez que ma réponse n'est pas valable.
Jesper Juhl
1
@jesper: non, j'ai déjà voté. Je pense que la question à laquelle vous avez répondu est plus précise, comme je l'ai dit. L'autre question, qui aurait pu être l'intention, nécessite un certain mouvement de main car elle est contrefactuelle: nous ne savons pas quels contextes hypothétiques cela pourrait inclure. Mais c'est la question littéralement posée, intentionnellement ou non, donc bravo pour y avoir répondu.
rici
1

Ce n'est actuellement qu'une réponse partielle.

Visual Studio 2019

Constructeurs

Lors de la définition d'un objet de classe, la fonction IntelliSense de Visual Studio affiche les constructeurs disponibles, générés par le compilateur et les vôtres:

entrez la description de l'image ici

Malheureusement, ces informations ne sont pas toujours disponibles. Pour le faire fonctionner pour la capture d'écran ci-dessus, j'ai dû taper quelque chose entre parenthèses, d'où la virgule.

Helge Klein
la source