3

変換を完全に理解したい、つまり、関数呼び出しがいつ暗黙の変換を引き起こし、いつコンパイルエラーを引き起こすのかを確実に知りたいです。次のリスト(優先度順)から最大2つのステップで変数を変換する唯一の方法がある場合にのみ、変換が行われる可能性があることを学びました。

1. Exact match
2. Promotion
3. Conversion
4. User defined conversion

どこで、私がそれを理解した方法(あなたは私を修正するかもしれません)は、プロモーションはプリミティブをより大きなプリミティブ型に変換することです。変換とは、int から char への変換など、昇格ではないプリミティブ間の変換です。また、ユーザー定義の変換は、変換コンストラクターと変換演算子を使用したクラスの変換です。これで、継承と Is-A 関係、つまり派生クラスが基本クラスであることもわかりました。したがって、基本クラスへの参照を期待する関数に派生クラスを送信するとうまくいくはずです。上記の 2 つの概念を組み合わせると、私が書いた次の例が機能するはずです。

class C {};
class D: public C
{
public:
D(int x){}
};
void f(C& c) {}
f(3);

D は int から変換できるため、D は C です。ただし、このコードはコンパイルされていません。何故ですか?矛盾はどのように解決できますか?この問題について少し光を当てることができますか?ありがとう!

4

1 に答える 1

5

const変換によって非参照にバインドできない一時が作成されるため、コードはコンパイルされません。

パラメーターをconst参照渡し (または値渡しですが、お勧めしません) にすると動作します。

また、基本クラスには変換コンストラクターも必要です (以下で説明します)。

class C {
public:
   C(int x){}
};
class D: public C
{
public:
   D(int x):C(x){}
};

void f(const C& c) {}
f(3);

これは、暗黙的な変換が最大 1 回しか適用されないためです。あなたの場合、 からint -> Dとからの直接変換がD -> Cあるため、intを暗黙的に に変換することはできませんC

于 2012-06-26T08:34:36.627 に答える