問題タブ [overload-resolution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - c++では、constも機能するのにコンパイラが非const関数を選択するのはなぜですか?
たとえば、次のクラスがあるとします。
コードの別の場所には、次のようなものがあります。
この場合、コンパイラが非 const バージョンを選択する理由を知っている人はいますか?
これはやや不自然な例ですが、解決しようとしている実際の問題は、オブジェクトが変更された場合にオブジェクトを定期的に自動保存することであり、ポインターはある時点で変更される可能性があるため、非 const でなければなりません。
c++ - operator>= のオーバーロードによる奇妙な動作
C++ での演算子のオーバーロードで奇妙な動作が発生しています。クラスがあり、その内容が long double 以上かどうかを確認する必要があります。このチェックを行うために >= 演算子をオーバーロードしました。私の宣言は次のとおりです。
私のクラスには、特定の条件下でのみ例外なく機能するキャストからロングダブルへの演算子もあると言わざるを得ません。ここで、この演算子を使用すると、コンパイラーは operator>= の使用があいまいであり、代替手段は次のとおりであると不平を言います。
- 私の。
- 組み込みの
operator>=(long double, int)
.
では、プログラムに演算子を強制的に使用させるにはどうすればよいでしょうか?
c++ - 次の例で、コンパイラが関数テンプレートのオーバーロードを選択しないのはなぜですか?
次の関数テンプレートがあるとします。
次のコードが常にオーバーロード #2 ではなくオーバーロード #1 を呼び出すのはなぜですか?
f
の 2 番目のパラメーターが の派生型であることを考えると、Base
オーバーロード #1 のジェネリック型よりも一致するオーバーロード #2 をコンパイラが選択することを期待していました。
これらの関数を書き直して、ユーザーがmain
関数に表示されるようにコードを記述できるようにするために使用できる手法はありますか (つまり、引数の型のコンパイラ推定を利用します)。
c# - C# 型によるメソッドのオーバーロード
以下が可能かどうか疑問に思っていました。匿名型 (string、int、decimal、customObject など) を受け入れるクラスを作成し、Type に基づいてさまざまな操作を行うメソッドをオーバーロードします。例
これで、GetName メソッドを呼び出すことができます。オブジェクトを初期化したときに型を渡したので、正しいメソッドが検出されて実行されます。
これは可能ですか、それとも私はただ夢を見ているだけですか?
c# - オーバーロード、ジェネリック型推論、および「params」キーワード
オーバーロードの解決に関する奇妙な動作に気付きました。
次のメソッドがあるとします。
さて、このメソッドは少数の明示的な引数で呼び出されることが多いことがわかっているので、便宜上、次のオーバーロードを追加します。
今、私はこれらのメソッドを呼び出そうとします:
ただし、どちらの場合も、with のオーバーロードparams
が呼び出されます。IEnumerable<T>
a の場合はオーバーロードが呼び出されることを期待していたでしょうList<T>
(少なくとも私には)。
この動作は正常ですか? 誰でも説明できますか?MSDNドキュメントでそれに関する明確な情報を見つけることができませんでした...ここに含まれるオーバーロード解決ルールは何ですか?
c++ - 一時的なものを含む演算子のオーバーロード解決の順序
次の最小限の例を考えてみましょう。
g++とVisualC++の両方での出力は次のとおりです。
一時オブジェクトに書き込むバージョンは、free演算子ではなくmyostream(cout)
、member演算子を優先するように見えます。オブジェクトに名前があるかどうかに違いがあるようです。ostream::operator<<(void *)
operator<<(ostream &, char *)
なぜこれが起こるのですか?そして、どうすればこの動作を防ぐことができますか?
編集:なぜそれが起こるのかは、さまざまな答えから明らかになりました。これを防ぐ方法については、次のことが魅力的です。
ただし、これにより、あらゆる種類のあいまいさが生じます。
c++ - 演繹中に関数のアドレスを解決できない場合、それはSFINAEまたはコンパイラエラーですか?
C ++ 0xでは、SFINAEルールが簡略化され、演繹の「即時コンテキスト」で発生する無効な式または型がコンパイラエラーではなく、演繹失敗(SFINAE)になります。
私の質問はこれです:
私がオーバーロードされた関数のアドレスを取り、それを解決できない場合、その失敗は演繹の直接の文脈でですか?
(つまり、ハードエラーですか、それとも解決できない場合はSFINAEですか)?
サンプルコードは次のとおりです。
Gcc 4.5は、これがコンパイラエラーであると述べており、clangはアサーション違反を吐き出します。
関心のあるいくつかの関連する質問があります:
FCD-C ++ 0xは、ここで何が起こるべきかを明確に指定していますか?
コンパイラはこのコードを拒否するのは間違っていますか?
演繹の「即時コンテキスト」をもう少し適切に定義する必要がありますか?
ありがとう!
c++ - ADLの落とし穴とは?
少し前に、引数依存ルックアップのいくつかの落とし穴を説明した記事を読みましたが、もう見つかりません。アクセスしてはいけないものにアクセスすること、またはそのようなものにアクセスすることについてでした。そこで、ここで質問したいと思います: ADL の落とし穴は何ですか?
c# - C# 4 でのオーバーロードの解決とオプションのパラメーター
関数の7つのオーバーロードを持つコードを使用していますTraceWrite
:
(パブリックの静的な名前空間のノイズはすべて、上と全体で省略されています。)
したがって、その背景で: 1) 他の場所では、4 つの引数を使用し
て呼び出します: 、および次のエラーが発生します。TraceWrite
string, LogLevelENUM, string, bool
この呼び出しが 2 番目のオーバーロードに解決されないのはなぜですか? ( TraceWrite(string, LogLevelENUM, string, bool, string = "")
)
2) で呼び出す場合TraceWrite
、string, LogLevelENUM, string, string
どのオーバーロードが呼び出されますか? 一代目か三代目?なぜ?
c++ - オーバーロードされた仮想関数呼び出しの解決
次のコードを検討してください。
this
の引数をアップキャストするのではなく、オブジェクトのポインターを基本クラスにアップキャストすることによって、C++ が最終行の関数呼び出しを解決することを選択する理由を知りたいf()
です。私が望む動作を得る方法はありますか?