タグ付けされた質問 「argument-dependent-lookup」

4
「引数依存ルックアップ」(別名ADL、または「ケーニッヒルックアップ」)とは何ですか?
引数に依存するルックアップが何であるかについてのいくつかの良い説明は何ですか?多くの人がケーニッヒルックアップとも呼んでいます。 できれば知りたいです。 なぜそれが良いのですか? なぜそれが悪いのですか? それはどのように機能しますか?

4
ADLが関数テンプレートを見つけられないのはなぜですか?
C ++仕様のどの部分が、引数に依存するルックアップが、関連付けられた名前空間のセットで関数テンプレートを見つけることを制限していますか?言い換えると、main以下の最後の呼び出しがコンパイルに失敗するのはなぜですか? namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }

6
BjarneはこのADLの例について間違っていますか、それともコンパイラのバグがありますか?
私はC ++プログラミング言語第4版(Bjarne Stroustrupによる)について読んでいます引数依存のルックアップ。引用は次のとおりです(26.3.6、過度に攻撃的なADL): 引数に依存するルックアップ(ADLと呼ばれることが多い)は、冗長性を回避するのに非常に役立ちます(14.2.4)。例えば: #include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL } 引数に依存するルックアップendlがないと、マニピュレータは見つかりません。そのまま、コンパイラは、への最初の引数<<がでostream定義されていることに気付きstdます。したがって、それは探しendlでstd、それ(内を検索します<iostream>)。 そして、コンパイラー(C ++ 11モード)によって生成された結果は次のとおりです。 prog.cpp: In function ‘int main()’: prog.cpp:4:36: error: ‘endl’ was not declared in this scope std::cout << "Hello, world" << endl; ^ これはコンパイラまたは本のバグです。規格は何と言っていますか? 更新: 少し明確にする必要があります。正しい答えはを使用することstd::endlです。質問は本の中のテキストについてでした。ラクランイーストンはすでにそれだけでタイプミスではない、と述べました。段落全体が(おそらく)間違っています。その本が他の(あまり知られていない)著者によるものであれば、私はこの種の誤りを受け入れることができますが、それがビャーネによって書かれたので、私は疑っていました(そして今でもそうです)。

1
C ++コンパイル時間カウンター、再訪
TL; DR この投稿全体を読む前に、次のことを知っておいてください。 提示された問題の解決策は自分で見つけましたが、分析が正しいかどうかを知りたいと思っています。 fameta::counter残りのいくつかの癖を解決するクラスにソリューションをパッケージ化しました。githubで見つけることができます。 godboltの作業でそれを見ることができます。 すべての始まり FilipRoséenが発見/発明して以来、2015年に、時間カウンターをコンパイルするブラックマジックはC ++にあるため、デバイスにややこだわっていたため、CWG が機能を実行する必要があると判断したときはがっかりしましたが、彼らの心はいくつかの説得力のある使用例を示すことで変更できます。 次に、数年前、私はそのことをもう一度確認することにしました。これにより、uberswitch esを入れ子にできるようになりました-私の意見では興味深いユースケースです- の新しいバージョンではもはや機能しないことを発見しただけです。問題2118がオープン状態であっても(現在も)利用可能なコンパイラー:コードはコンパイルされますが、カウンターは増加しません。 この問題は、RoséenのWebサイト、および最近ではstackoverflowでも報告されています。C++はコンパイル時カウンターをサポートしていますか? 数日前、もう一度問題に取り組み、取り組むことを決めました コンパイラーの何が変わったのかを理解したかったのです。そのために、私は誰かがそれについて話してくれるようにインターウェブをずっと遠くまで検索しましたが、役に立ちませんでした。だから私は実験を始め、いくつかの結論に達しました。私はここで提示しているのですが、ここでは自分よりも知識のある人からフィードバックを得たいと思っています。 以下では、わかりやすくするために、Roséenの元のコードを示します。それがどのように機能するかの説明については、彼のウェブサイトを参照してください: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; template<int …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.