2012-02-12 2 views
0

はどうやって機能fooを呼び出すときに、私は(それが私の即時の範囲内ではありません)ADL対スコープ解像度 - どれが好きですか?

my_type bar; 
using some_namespace::foo; 
foo(bar); 

代わりの

some_namespace::foo(bar); 

を使用する必要があるかどうかを教えていますか?あなたがADLを使うべきかどうかを考え出すための一般的な "規則"はありますか?どちらを "デフォルトで"使うべきですか?

+0

いずれもADLではありません。 – ybungalobill

+0

@ybungalobill:なぜですか?それは[ここ](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)とはかなり類似しているようです...間違いはどこですか? – Mehrdad

+0

コンテキストからコードを取り除くことはできません。もう1つのコードを追加して同じ意味を持つと想定してください。 ADLは構文上の特徴ではなく、動作上の特徴です。私。 ADLが非修飾バージョンで使用されているかどうかを判断するために、あなたのプログラムで 'foo'が宣言されているかどうかを言わなければなりません。 – ybungalobill

答えて

1

これはADLではありません。どちらの例でも、通常の検索でfooが見つかりました。次のようにADLを使用した例は次のようになります。

namespace ns { 
    class A { }; 
    void f(A) { }; 
} 

int main() { 
    f(A()); 
} 

をここで、fは、通常のルックアップからは見られないが、(それはAと一緒に名前空間nsであるため)、それは引数依存ルックアップから発見されました。いずれにしても...

可能な限りADLを避けてください。

ADLは、オペレータのオーバーロードやスワップ可能なコンセプトなど、特定のシナリオで有益です。ただし、他の多くのケースではbizarre, unexpected behaviorになるため、あまり使用しないでください。

+0

うーん..待っているが、 'swap'のようなものはどうでしょうか?std名前空間とクラスの両方で定義されていますか? '' std :: swap;を使う必要はないでしょうか?私の例で間違いはどこですか? (私のものは[ここ](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)のように見えます) – Mehrdad

+0

あなたの例では、 'foo'だけが' some_namespaceから持ち込まれたものです'なので、ADLを通して見つかる' foo'はありません。 –

+0

@Mehrdad:質問に投稿したコードは、資格を満たしていない通話と非通話を比較しています。最初のものはADLを含むかもしれませんが、それはまだ "ADL"ではありません。はい、ADLと一緒に '使用する 'ことは一般的ですが、完全に異なる機能なので、修飾された呼び出しと比較することはできません。 – ybungalobill

関連する問題