C の変換演算子を理解する
次のコード スニペットを考えてみましょう。
template <class Type> class smartref { public: smartref() : data(new Type) { } operator Type&() { return *data; } private: Type* data; }; class person { public: void think() { std::cout << "I am thinking"; } }; int main() { smartref<person> p; p.think(); // Why doesn't the compiler try substituting Type? }
C では、変換演算子が再生されます。型変換において重要な役割を果たします。では、それらはどのように機能するのでしょうか?
1.引数受け渡し中の変換:
変換演算子は、コピー初期化ルールに従って、引数受け渡し中に考慮されます。参照への変換であるかどうかに関係なく、ソース型を互換性のある型に変換します。
2.参照への変換:
変換された型が左辺値の場合、条件演算子で参照への変換が許可されます。さらに、参照を直接バインドする場合は、参照への変換も必要となる場合があります。
3.関数ポインターへの変換:
関数ポインターまたは参照へのユーザー定義の変換は、関数呼び出しを行うときに使用されます。
4.非クラス型への変換:
ブール値へのような暗黙的な変換では、ユーザー定義の変換関数を使用できます。
5.変換関数テンプレート:
テンプレートを使用して、型を任意のポインター型 (メンバー ポインターを除く) に変換する変換関数を作成できます。
コンパイラーが変換しない理由Substitute Type?
指定された例では、コンパイラは変換によって Type を置換しません。 Smartref の演算子は、内部データ メンバーへのポインターを返します。 think() を呼び出そうとすると、コンパイラは p が person オブジェクトへの参照ではなく、person オブジェクトへのポインタであると推測します。したがって、明示的な型置換は行われません。
以上がコンパイラが変換演算子の型を置き換えないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。