変換を完全に理解したい、つまり、関数呼び出しがいつ暗黙の変換を引き起こし、いつコンパイルエラーを引き起こすのかを確実に知りたいです。次のリスト(優先度順)から最大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 です。ただし、このコードはコンパイルされていません。何故ですか?矛盾はどのように解決できますか?この問題について少し光を当てることができますか?ありがとう!