はどうやって機能foo
を呼び出すときに、私は(それが私の即時の範囲内ではありません)ADL対スコープ解像度 - どれが好きですか?
my_type bar;
using some_namespace::foo;
foo(bar);
代わりの
some_namespace::foo(bar);
を使用する必要があるかどうかを教えていますか?あなたがADLを使うべきかどうかを考え出すための一般的な "規則"はありますか?どちらを "デフォルトで"使うべきですか?
はどうやって機能foo
を呼び出すときに、私は(それが私の即時の範囲内ではありません)ADL対スコープ解像度 - どれが好きですか?
my_type bar;
using some_namespace::foo;
foo(bar);
代わりの
some_namespace::foo(bar);
を使用する必要があるかどうかを教えていますか?あなたがADLを使うべきかどうかを考え出すための一般的な "規則"はありますか?どちらを "デフォルトで"使うべきですか?
これはADLではありません。どちらの例でも、通常の検索でfoo
が見つかりました。次のようにADLを使用した例は次のようになります。
namespace ns {
class A { };
void f(A) { };
}
int main() {
f(A());
}
をここで、f
は、通常のルックアップからは見られないが、(それはA
と一緒に名前空間ns
であるため)、それは引数依存ルックアップから発見されました。いずれにしても...
可能な限りADLを避けてください。
ADLは、オペレータのオーバーロードやスワップ可能なコンセプトなど、特定のシナリオで有益です。ただし、他の多くのケースではbizarre, unexpected behaviorになるため、あまり使用しないでください。
うーん..待っているが、 'swap'のようなものはどうでしょうか?std名前空間とクラスの両方で定義されていますか? '' std :: swap;を使う必要はないでしょうか?私の例で間違いはどこですか? (私のものは[ここ](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)のように見えます) – Mehrdad
あなたの例では、 'foo'だけが' some_namespaceから持ち込まれたものです'なので、ADLを通して見つかる' foo'はありません。 –
@Mehrdad:質問に投稿したコードは、資格を満たしていない通話と非通話を比較しています。最初のものはADLを含むかもしれませんが、それはまだ "ADL"ではありません。はい、ADLと一緒に '使用する 'ことは一般的ですが、完全に異なる機能なので、修飾された呼び出しと比較することはできません。 – ybungalobill
いずれもADLではありません。 – ybungalobill
@ybungalobill:なぜですか?それは[ここ](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)とはかなり類似しているようです...間違いはどこですか? – Mehrdad
コンテキストからコードを取り除くことはできません。もう1つのコードを追加して同じ意味を持つと想定してください。 ADLは構文上の特徴ではなく、動作上の特徴です。私。 ADLが非修飾バージョンで使用されているかどうかを判断するために、あなたのプログラムで 'foo'が宣言されているかどうかを言わなければなりません。 – ybungalobill