問題タブ [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.
c++ - ADL とスコープ解決 -- どちらを優先するか?
使用する必要があるかどうかをどのように判断しますか
それ以外の
私の関数を呼び出すときfoo
(それは私の直接の範囲内にありません)?ADL を使用するかどうかを判断するための一般的な「ルール」はありますか? 「デフォルトで」どちらを使用する必要がありますか?
c++ - 引数依存ルックアップが関数テンプレートdynamic_pointer_castで機能しない理由
次のC++プログラムについて考えてみます。
MSVC 2010でコンパイルすると、次のエラーが発生します。
auto
に置き換えてもエラーは解決しませんstd::shared_ptr<A>
。呼び出しを完全に修飾するとstd::dynamic_pointer_cast
、プログラムは正常にコンパイルされます。
また、gcc4.5.1もそれを好きではありません:
名前空間に存在するタイプなので、これはKoenigルックアップstd::dynamic_pointer_cast
によって選択されたと思います。ここで何が欠けていますか?x
std
c++ - ラムダ引数があるとADLが失敗しますか?
かなり前に、引数の少なくとも 1 つがラムダである場合、Visual C++ 10 で ADL が失敗することに気付きました。
上記は VC++10 および 11 (ベータ) でのコンパイルに失敗します (begin と end は ADL を介して検出されます)。ラムダ関数を通常の自由関数に変換すると、期待どおりに機能します。
Herb Sutters ブログで 1 回質問したことがあり、msdn connect の投稿も読んだことがありますが、通常の回答は次のとおりでした。これはバグです。ラムダの最新の標準をまだ実装していません。物事はまだ焼きたての形になっていません。MS Connect では、これが次のリリース、つまり vc 11 で解決されないという不穏なコメントもありました。
私の質問は、このコードは C++11 標準で動作すると予想されますか? 私はそれを完全に理解することはできません。ラムダを使用している場合、for_each やその他のアルゴリズムの前に std:: を付ける必要がありますか? この動作は vc++11 のリリース後も変わらないのではないかと思います。
c++ - オーバーロード セットから現在の関数を削除するには?
名前空間 に関数があります。この関数の仕事は、引数依存ルックアップを使用しns::foo
て の呼び出しをディスパッチすることです。foo
foo
クライアントが手動でインスタンス化せずに呼び出せるようにしたい、つまり:
いいえ
もちろん問題は、よりもns::foo
適切な一致がない場合、 が再帰的であることです。foo
ns::foo
別の名前を付けたくないns::foo
ので、内部に設定されたオーバーロードから削除する方法はありますか?
c++ - ADLは特定の状況では機能しません
以下のようにis_iterableテンプレートを作成しました。これは、無料の関数begin / endが(ADLのコンテキストで)使用可能であることを確認し、適切なイテレーターオブジェクトを返します。(これは、ranged-forループ内の反復可能なオブジェクトの要件です)
上記のコードは、vs2010で意図したとおりに機能しますが、gccでは機能しません。また、以下のように「begin」というランダムなフリー関数を入れると、vs2010でも壊れてしまいます。
コードを機能させるにはどうすればよいですか?また、「is_iterable」コンセプトチェッカーを改善する提案をいただければ幸いです。
追加:「書き込み」機能は単なる概念のデモンストレーションの例です。貴重な時間を費やさないでください。(私はそれが最良のコードではないことを知っています:()注意が必要な部分はADLの振る舞いと「is_iterable」テンプレートです:)
c++ - 引数依存ルックアップは名前空間またはクラスのみを検索しますか?
Josuttis テンプレート ブックを読んでいて、ADL について頭を悩ませようとしています。彼は、「ADL は、呼び出し引数の型に「関連付けられた」名前空間とクラスで名前を検索することによって処理を進める」と述べています。クラスで名前を検索する方法を確認しようとしています。以下に私のテストの例を示します。名前空間で名前を検索する方法がわかります。
しかし、bryan_ns を名前空間に次のように変更すると:
c++ - C ++テンプレートクラスにswap()を提供すると、std :: swap()が壊れますか?
カスタムMatrixクラスにコピーアンドスワップイディオムを実装しようとしていたところ、リンク先の質問で提案されている方法でswap()の実装に問題が発生しました。
(私が使用したコンパイラはMS VS2010 IDEのものであり、方言は古き良きC ++ 03です。)
この名前空間にある関数のコードで通常のstd::swap()に到達するのに問題があります。
残念ながら、何らかの理由でmy_space::swap()
、Matrixは他のすべての呼び出しをエイリアスしているようstd::swap()
です。引数が適合せず、ADLが優先する必要があるため、理由がわかりませんstd::swap
。
(エラーは、使用しようとしているすべての行で10回繰り返されますstd::swap
)
引数が合わない場合でも、my_space::swap()
常にで却下std::swap()
しますか?my_space
表示されていないわけではなく、作成std::swap()
前my_space::swap()
は問題なく動作していました。
c++ - テンプレート クラスのベースを介した引数依存のルックアップ
名前空間にNB::B<T>
非テンプレート クラスから派生したテンプレート クラスがあります。テンプレート引数のインスタンスで関数を呼び出すテンプレート関数です。具体的には、 ADL を使用して の baseの名前空間で定義されているものを見つけたいと考えています。完全な例は次のとおりです。NA::A
act<T>
add_ref
act<NB::B<int>>
add_ref
NB::B
これはgcc
(4.7.0) で問題なくコンパイルされます。しかもComeau
オンラインで。ただしclang
、(3.1) は失敗します。
同時に、規格には次のように書かれています。
3.4.2/2 …</p>
— T が template-id の場合、関連付けられた名前空間とクラスは、テンプレートが定義されている名前空間です。メンバー テンプレートの場合は、メンバー テンプレートのクラス。テンプレート型パラメーター (テンプレート テンプレート パラメーターを除く) に提供されるテンプレート引数の型に関連付けられた名前空間とクラス。テンプレート テンプレート引数が定義されている名前空間。テンプレート テンプレート引数として使用されるメンバー テンプレートが定義されているクラス。
驚いたことに、テンプレートのベースは、関連付けられた名前空間へのパスとしてリストされていません。したがってclang
、 の動作は正しいように見えます。そしてComeau
とgcc
は間違ったプログラムを受け入れています。
同時に、が引数の名前空間に3.4.2/3
ある状態は効果がありません:using
関連付けられた名前空間を考慮する場合、検索は、関連付けられた名前空間が修飾子として使用されるときに実行される検索と同じです (3.4.3.2)。
— 関連する名前空間の using ディレクティブは無視されます。
しかし、コメントを外すと、using NA::add_ref
行clang
は喜んでテストをコンパイルします。
私の例を実用的な観点から考えると、これはbase から派生した、 was 、 was 、wasact
のメソッドであると考えることができます。boost::intrusive_ptr
add_ref(A*)
intrusive_ptr_add_ref(CBase*)
B
CBase
これに関して、いくつか質問があります。
私
clang
のテストプログラムを拒否するのは正しく、標準に従わないのは正しいgcc
ですComeau
か?標準がそのような非実用的な動作を指定する理由はありますか (テンプレート クラス ベースを関連付けられた名前空間として許可しません)。
という理由でディレクティブを
clang
使用してテスト プログラムを受け入れるのは間違っていますか?using NA::add_ref
3.4.2/3
バグを報告する必要がありますか? :)
PS clang Language Compatibility FAQを読みましたが、回答が見つかりませんでした。
c++ - 引数に依存する名前の検索:調査する名前空間を追加します
ADLルールを利用して、追加の名前空間の関数をチェックしたいと思います。
あるとしましょうclass X
。
通話中
コンパイラに調べてもらいたいのですがnamespace funky
、これまではとは関係ありませんでしたclass X
。funky::f
しかし、私は.を呼び出すたびに置くことによってコード化されたものを乱雑にしたくありませんf
。
class X
これを実現する1つの方法は、からの引数を持つテンプレートクラスとして定義することnamespace funky
です。
呼び出しf(x)
の場合、コンパイラは実際にを検索しfunky::f
ます。
同じ動作を実現するためのよりクリーンで簡単な方法はありますか?someClassFromFunky
(特に、の宣言で任意のクラスを参照するのclass X
は厄介です。)
c++ - テンプレートのインスタンス化における C++11 スタイルの SFINAE と関数の可視性
これが sfinae と関係があるのか 、それともテンプレート化された関数に関連するものなのかはわかりません。sfinae を使用して、対応するフリー関数の存在に基づいてメンバー関数を有効/無効にしようとしています。これは、別の型のメンバー関数の存在に基づいて有効/無効にされます。ここで説明するすべての方法を使用します。
ただし、gcc 4.7.1 では、矢印でマークされた行に次のように表示されます。
エラー: 'S::f(S&, const pass&)' の呼び出しに一致する関数がありません
注: 候補は:
注: テンプレート decltype ((f((* this), t), void())) S::f (const T&)
注: テンプレート引数の演繹/代入に失敗しました:
注: 候補者は 1 つの引数を期待し、2 つの引数が提供されることを期待しています
これは明らかに、f
上記のグローバルがオーバーロードの解決には考慮されていないことを意味します。
それはなぜですか、そうするために私は何をしますか?
f
また、同様の方法で decltypeで使用されている場合、2 行上にエラーがないのはなぜですか?
アップデート
@nm が言ったように、メンバー関数は署名が異なっていても完全に自由な関数をシャドーしf
ます。フリー関数 ( f_dispatcher
) を誰も見ない場所 ( detail
) に作成し、その名前を 内で完全に修飾しますS::f
。その関数で freef
を呼び出し、それ以降は ADL に処理させます。次のようにします。