0

auto_ptrC++03でどのように機能するかを理解しています。これはこのトリックに基づいています。このトリックは、このようなコードが記述されているときに、ユーザー定義の変換を使用して、あるオブジェクトから別のオブジェクトへのポインターを盗みますauto_int p(auto_int(new int()));。ただし、この点に関していくつか質問があります。

  1. コンパイラで生成されたcopy-ctorが呼び出されないのはなぜですか?
  2. ユーザー定義の変換がコンパイラーで生成されたcopy-ctorよりも優先されるのはなぜですか?
  3. そもそもコンパイラで生成されたcopy-ctorはありますか?
  4. そうでない場合、どの言語規則がそれを抑制しますか?
4

1 に答える 1

0

コンパイラで生成されたcopy-ctorが呼び出されないのはなぜですか?

クラスはすでにコピーコンストラクターを提供しているため、変更可能なコンストラクターは引き続き有効であり、コンパイラーはデフォルトのコンストラクターを生成しません。

ユーザー定義の変換がコンパイラーで生成されたcopy-ctorよりも優先されるのはなぜですか?

コンパイラによって生成されたコピーコンストラクタはありません。

そもそもコンパイラで生成されたcopy-ctorはありますか?

ついに!いいえ、ありません。

そうでない場合、どの言語規則がそれを抑制しますか?

12.8.2です:

クラスXの非テンプレートコンストラクターは、最初のパラメーターがタイプX&、const X&、volatile X&、またはconst volatile X&であり、他のパラメーターがないか、他のすべてのパラメーターにデフォルトの引数がある場合、コピーコンストラクターです。

そして12.8.4:

クラス定義でコピーコンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。

于 2012-05-25T21:07:22.870 に答える