Koenigルックアップの理論的根拠は何ですか?
コードを読みにくくし、より不安定にする何かのように考えることは避けられません。
特定のケース (つまり、非メンバー演算子) または明示的に必要な場合にのみ機能するように、Koenig ルックアップを定義できませんでしたか?
Koenigルックアップの理論的根拠は何ですか?
コードを読みにくくし、より不安定にする何かのように考えることは避けられません。
特定のケース (つまり、非メンバー演算子) または明示的に必要な場合にのみ機能するように、Koenig ルックアップを定義できませんでしたか?
元々の動機であるIIRCは、書くことができるようにすることでした。
std::cout << 42;
std::operator<<(std::ostream&, int)
明示的に修飾する必要はありません。
引数に依存するルックアップを無効にする場合は、関数名を明示的に修飾できます。std::swap
代わりにを使用して、引数が存在する名前空間で検索されswap
ないようにします。swap
ADLをSFINAEとともに使用して、コンパイル時に特定のタイプに対して関数が定義されているかどうかをテストすることもできます(これを演習として実行します。これについては、Stackoverflowで少なくとも1つの質問があります)。
ADL の最も強力な使用例は、このような場合です。
namespace A
{
struct S {};
S operator+( const S&, const S& );
}
namespace B
{
A::S test()
{
A::S a, b;
return a + b;
}
}
また、汎用コードで正しい関数を選択する場合にも役立つため、swap
関数だけに適用する必要はありませんoperator
。それはすでに標準のかなり複雑な部分であり、場合によってはそれが機能しないようにするルールを作成すると、さらに複雑になりますが、それによって何が得られるでしょうか?
別の名前空間で関数を直接呼び出すよりもはるかに冗長ではなく、いずれにしても式をより複雑にする、明示的に要求するきちんとした方法は考えられません。
私たちはあなたが次のようなことを考えています: return [[ use_adl ]] (a + b);
vs. return A::operator+( a, b );
?