コンパイラが生成した関数を見つける方法は?


11

コンパイラが生成した関数、3つのルールと5つのルールについて知っています。実際のシナリオでは、コンパイラによって生成された関数(コンストラクタ、代入演算子、デストラクタ)のどれが実際にコンパイラによって作成されたかを正確に把握するのは簡単なことではありません。

特定のクラスのコンパイラー生成関数をリストする方法はありますか?

私は主にVisual Studio 2019とXcodeに興味がありますが、一般的なソリューションがさらに歓迎されます。

回答:


11

ルールは複雑です。Howard Hinnantのプレゼンテーションの表を引用した別の回答から盗みます。

ここに画像の説明を入力してください

ここでの教訓は、コンパイラーの暗黙の宣言に依存せず、すべての特殊メンバーを明示的に宣言することです(デフォルトに応じて、または必要に応じて削除されます)。


すべての特別なメンバーを明示的に宣言すると、移動コンストラクターと代入演算子の「宣言されていない」特別なメンバーのステータスが失われます。
Maxim Egorushkin

@MaximEgorushkin私のポイントは、必要に応じてそれらをデフォルトで宣言することです(ただし、デフォルトは宣言されていないことを意味する場合もあります)、または不要な場合は削除します。
ボロフ

2
@bolovチャートは役に立ちますが、これは私の質問の答えにはなりません。どの関数が実際にコンパイラーによって生成されたかを知りたい。言い換えれば、私は理論的に何が起こるべきかについて尋ねているのではなく、実際に何が起こっているのかを尋ねています。
Helge Klein

1
@ tjwrona1992:その引数により、コンパイラーが意図したものとは異なる何かをした場合、そこにバグがあるはずであることを知っているので、コードをテストする必要はありません。
ruakh

1
@ tjwrona1992:はい、その通りです。同様に、コンパイラーが生成したものを確認するポイントは、コンパイラーが正しいことを確認することではなく、コンパイラーに正しい入力を提供したことを確認することです。
ruakh

7

「特定のクラスのコンパイラー生成関数をリストする方法はありますか?」

もちろんあります。上のLinux(や他のUnixシステム)を使用できnmreadelfそしてobjdump上の生成されたオブジェクト・ファイル/ライブラリ/任意のエクスポートされたシンボル(とはるかに)それらを分解して点検することを実行。

Windowsにも同様のツールがありますが、それは私がよく使用しているプラットフォームではないため、残念ながら、正確なツール名をここで指定することはできません。


1
これらのツールは、生成された可能性のある関数を表示しない場合あります(つまり、コンパイラーが生成することは許可されていましたが、それらの関数を使用したことがなかったため、迷惑をかけないか、リンク時のコードの削除によって削除されました)。
JMAA

@JMAAほとんどの場合、「生成は許可されているが使用されていない」とは、標準的には、関数が「暗黙的に宣言された」が「暗黙的に定義された」のではないことを意味します。はい、これは、インライン化が無効になっていても、シンボルが表示されないことを意味します。
アシェプラー

1
厳密に言えば、この答えは、「コンパイラはどのメソッドを生成したか?」という質問に、より正確に答えます。これは、「コンパイラーによって異なるコンテキストで生成された可能性のあるメソッドはどれか」というはるかに正確でない質問と同じではありません。
リチ

@rici True。しかし、より正確な質問は簡単に答えられないので、私は答えられる可能性のあるものを探しました。私の回答が価値がないと思われる場合は、遠慮なく投票してください。
Jesper Juhl

1
@jesper:いいえ、すでに賛成しています。私が言ったように、あなたが答えた質問はもっと正確だと思います。もう1つの質問は意図的だったかもしれませんが、矛盾しているため、何らかの手を振る必要があります。どのような仮想的なコンテキストが含まれるかはわかりません。しかし、これは意図的にかどうかにかかわらず、文字どおりに尋ねられる質問なので、それに答えることを称賛します。
リチ

1

これは現在、部分的な回答にすぎません。

Visual Studio 2019

コンストラクタ

クラスオブジェクトを定義すると、Visual StudioのIntelliSense関数は、コンパイラーによって生成されたコンストラクターと独自のコンストラクターの両方を使用できるコンストラクターを表示します。

ここに画像の説明を入力してください

残念ながら、この情報は常に表示されるとは限りません。上のスクリーンショットで機能させるには、かっこ内に何かを入力する必要があったため、カンマを使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.