それは正常な機能のために許可されていないながら、なぜ、暗黙の型変換メンバー関数は、戻り値の型で作業をオーバーロードするのですか?
-
13-09-2019 - |
質問
C ++は、その戻り値の型に基づいた方法のための多型を許可していません。暗黙的な変換のメンバ関数をオーバーロードするときしかし、これは可能なようです。
誰もがなぜ知っていますか?私は、オペレータが内部メソッドのように処理されていると思っています。
編集:ここでは例です。
struct func {
operator string() { return "1";}
operator int() { return 2; }
};
int main( ) {
int x = func(); // calls int version
string y = func(); // calls string version
double d = func(); // calls int version
cout << func() << endl; // calls int version
}
解決
変換演算子は、本当に異なるオーバーロードを考慮されていないと、彼らは、の彼らの戻り値の型のに基づいて呼び出されません。コンパイラは(タイプに互換性がないと変換されなければならないとき)には にしなければならない場合にのみ、それらを使用するか、明示的にキャスト演算子でそれらのいずれかを使用するように求められたときます。
ます意味的に、どのようなあなたのコードがやっていることの別のの型変換演算子と単一のオペレータのののないオーバーロードいくつかを宣言することです。
他のヒント
これは、型を返していません。これは、型変換です。
検討:FUNC()は、タイプFUNCのオブジェクトを作成します。どのような方法(コンストラクタ)のようにあいまいが呼び出されませんがあります。
希望の型にキャストすることが可能である場合にのみ残っている質問です。あなたは適切な変換をコンパイラを提供し、それは幸せです。
結果の種類に機能の過負荷を防ぐための技術的な理由は本当にありません。これは、たとえばAdaのようないくつかの言語で行われているが、また、暗黙の変換(およびそれらの2種類)を持つCの文脈++で、有用性が低減され、両方の機能の相互作用が急速に曖昧につながるでしょう。
あなたは暗黙的な変換が結果タイプに過負荷をシミュレートするために定義可能なユーザーであるという事実を使用することができます:
class CallFProxy;
CallFProxy f(int);
class CallFProxy {
int myParameter;
CallFProxy(int i) : myParameter(i) {}
public:
operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};
オーバーロード解決は、複数の候補関数の間を選択します。このプロセスでは、候補者の戻り値の型は確かに考慮されていません。しかし、変換演算子の場合には「戻り型」は、オペレータがすべての候補であるかどうかを決定する上で極めて重要です。