問題タブ [argument-dependent-lookup]

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.

0 投票する
2 に答える
534 参照

c++ - `decltype` および ADL ルックアップと非 ADL ルックアップの混合

テストケース

が組み込みデータ型である場合、関数の戻り値の型をヘッダーからauto foo(T f)呼び出す場合と同じにします。sin(f)cmathf

これは壊れています。sin(f)withinはwithindecltypeで検索されないため、戻り値の型が であるバリアントstdのみが見つかります。次のプログラムは、次のことを示しています。Csin(double)double

出力:

double出力は、戻り値の型が常にfor foo->float and foo->doubleであること 示唆していfoo()ます。sin(float|double)using std::sin

そのようなケースはすでに gremium で考慮されていたのだろうかと思いますが、それは私の質問ではありません。

質問

私の質問は:

名前が inまたは ADL-looked-up のfooいずれかである関数と同じ戻り値の型を持たせるための賢明な方法は何ですか?namespace std

機能しない回避策:

標準案?

is の順列を使用するenable_ifと、コードの自己文書化が妨げられます。enable_ifメタプログラミングの良い練習です。しかし、一見単純な機能をすばやく把握することは、正しいことではないため、保守性の精神に反します。


編集:私はdecltypeSFINAEをあまりあいまいに使用することもしていないので、新しいauto foo() {....}宣言を含むC++ 14は役に立たないかもしれません。

0 投票する
1 に答える
437 参照

c++ - Argument Dependent Lookup の逆の回避策は?

C++ には ADL (Argument Dependent Lookup) があり、その名前が示すように、関数のコンテキスト (名前空間) を引数 (のいずれか) のコンテキスト (名前空間) から暗示することができます。

私の質問は、何らかの手法で逆も可能かどうかです。逆に言えば、呼び出された関数のコンテキストからコンテキスト (名前空間) を推測できるかどうかを意味します。ある種の「関数依存ルックアップ」(FDL)。偽のコード:

私はそれを行う方法を理解できません。この制限は、enum関数のオプションをエンコードするために使用される s にとって特に厄介です。この機能をシミュレートする手法があるかどうか知りたいです (C++11 も問題ありません)。偽のコード:

特にenums の回避策がある場合。

このコードは問題を示しています。


編集: @jrok は、ネストされた名前空間の定義に基づく回避策を提案しました。このenum場合、このコードを取得します。これにはまだ多少のノイズがあります (実際には「依存」ルックアップはまったくありません) が、改善されています。

、 などをスコープ内で直接使用できないenum classため、Saturday使用していません(実際にはコンパイルエラーが発生します)Sundayusing longname::days::_

0 投票する
1 に答える
82 参照

c++ - equal() と find() の実装

次のコードでは、equal()呼び出しを修飾する必要があります (そうしないと、「オーバーロードされた関数へのあいまいな呼び出し」が発生します)、 unqualified を呼び出すことができますfind()。違いは何ですか?

引数依存のルックアップに関連していると思いますが (この質問を参照)、これら 2 つの呼び出しが異なる理由はまだわかりません。

0 投票する
3 に答える
401 参照

c++ - 引数依存のルックアップが与えられた場合、ステートメント「std::cout << std::endl;」で使用されるときに「std::endl」が名前空間修飾を必要とするのはなぜですか?

引数依存のルックアップに関するウィキペディアのエントリを見ていましたが、(2014 年 1 月 4 日) 次の例が示されました。

...次のコメント付き:

std::endl は関数ですが、operator<< の引数として使用されるため、完全修飾が必要であることに注意してください (std::endl は関数呼び出しではなく関数ポインターです)。

私の考えでは、コメントは正しくありません (または単に不明確です)。代わりに、コメントを言うように変更することを検討しています

ADL は関数呼び出しの引数には適用されないため、std::endl には完全修飾が必要であることに注意してください。関数名自体にのみ適用されます。

ウィキペディアのコメントが間違っているというのは正しいですか? 提案された変更は正しいですか? (つまり、この例での ADL の私の理解は正しいですか?)

0 投票する
1 に答える
1160 参照

c++ - std::list::remove_if( function()::predicate ) の呼び出しに一致する関数がありません

では、関数内で述語を定義してstd::list::remove_if引数として使用することは許可されていませんか?


コンパイルに失敗する次のコードを検討してください。


今、私l.remove_if( pred() );

これremove_ifは内部的に実行され、コンパイルされ、期待どおりに動作します。

さらに、メインのstruct predで定義されるように移動すると、両方のテストが期待どおりに機能します。


これは私には意味がありません。

従属名とかADLとかそういうのかなと思ったのですが… の引数が型でremove_ifなくインスタンスです。確かに、これはテンプレート関数であり、引数の型はまだ解決されていますが..

誰かが何が、なぜ起こるのか説明できますか?

0 投票する
0 に答える
3917 参照

apache-flex - adl で「無効なアプリケーション記述子: 不明な名前空間: library://ns.adobe.com/flex/spark」を取得する (Flash Builder コマンドラインデバッガー)

「無効なアプリケーション記述子: 不明な名前空間: library://ns.adobe.com/flex/spark」を取得しています

flash-builder 4.6 adobe air プロジェクトに adl (コマンドライン デバッガー) を使用する場合

その非常に単純なプロジェクト

mxml ファイルは次のように始まります。

xmlns 値を " http://ns.adobe.com/air/application/3.1 "/ に交換することで解決できる、同様の問題について読みました。

値を交換すると、別のエラーが発生しました:

「無効なアプリケーション記述子: アプリケーション ファイル名には空でない値が必要です」

また、

これの全体的な理由は、air アプリを実行する必要があるプログラムがあるため、コマンドラインで flash-builder プロジェクトを実行する方法が必要だからです。

私はadlを使用しています

これが最善の方法ですか?


編集 :

記述子ファイルのコード:

0 投票する
2 に答える
685 参照

c++ - 2 フェーズ ルックアップでオーバーロードされたバージョンの「スワップ」を選択できないのはなぜですか?

ユーザー定義型の関数を実装するためのベスト プラクティスに関する微妙な質問に対するこの魅力的な回答を研究しています。(私の質問は、当初、名前空間に型を追加することの違法性に関する議論によって動機付けられました。)swapstd

上記のリンクの回答からコード スニペットをここに再印刷しません。

代わりに、答えを理解したいと思います。

上記でリンクした回答は、最初のコード スニペットの下に、(その名前空間に特化するのではなく) オーバーロードに関して次のように述べますswapnamespace std

コンパイラが別のものを出力する場合、テンプレートの「2 フェーズ ルックアップ」が正しく実装されていません。

答えは、オーバーロードするのではなく)特殊swapnamespace std化すると異なる結果(特殊化の場合の望ましい結果)が生成されることを指摘します。

ただし、答えは追加のケースに進みます。ユーザー定義のテンプレートクラスのスワップを特殊化します。この場合も、目的の結果は得られません。

残念ながら、答えは単に事実を述べているだけです。理由は説明されていません。

誰かがその回答について詳しく説明し、その回答で提供されている2つの特定のコードスニペットでルックアップのプロセスを説明してください:

  • ユーザー定義の非テンプレート クラスのオーバーロード(リンクswapnamespace stdれた回答の最初のコード スニペットのように)

  • ユーザー定義のテンプレートクラスに特化swapnamespace stdています(リンクされた回答の最後のコードスニペットのように)

std::swapどちらの場合も、 user-defined ではなくジェネリックが呼び出されswapます。なんで?

(これにより、2 フェーズ ルックアップの性質と、ユーザー定義の実装のベスト プラクティスswapの理由が明らかになります。感謝します。)

0 投票する
1 に答える
237 参照

c++ - Boost.Range range_begin/end フリー関数が const 参照と非 const 参照の両方でオーバーロードされるのはなぜですか?

Boost.Rangeでこの興味深いビットを見つけました:

独立した関数range_begin/end()を提供する場合、ドキュメントには次のように記載されています。

...range_begin()および参照引数range_end()の両方に対してオーバーロードする必要がありconst ます。mutable

実際、 のデフォルトを見てみるとend.hpp、次のことがわかります。

両方のバージョンが同じ型を返すことに注意してください (ドキュメントに示されている例もこれを行っています)。Iterator

そもそもなぜ両方のオーバーロードが必要なのでしょうか? ADLを機能させるためですか?