2012-02-12 50 views
0

我怎麼知道我是否應該使用的ADL與範圍分辨率 - 哪個更喜歡?

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

代替

some_namespace::foo(bar); 

打電話給我的功能foo(這不是我的眼前範圍內)時?有沒有一個通用的「規則」來確定你是否應該使用ADL?哪一個我應該使用「默認」?

+0

這兩者都不是ADL。 – ybungalobill 2012-02-12 05:41:32

+0

@ybungalobill:爲什麼?它與[這裏](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)很相似......錯誤在哪裏? – Mehrdad 2012-02-12 05:48:32

+0

你不能從上下文中取出一段代碼,添加另一段代碼,並假定它有相同的含義。 ADL是行爲特徵,不是句法特徵。即你必須說明在你的程序中聲明瞭什麼'foo'來確定是否在非限定版本中使用了ADL。 – ybungalobill 2012-02-12 05:56:20

回答

1

這不是ADL。在這兩個示例中,foo都是通過正常查找找到的。使用ADL將如下的例子:

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

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

這裏,f不經由正常查找發現,但它是通過參數相關的查找實測值(因爲它是在名稱空間ns旁邊A)。無論如何...

儘可能避免ADL。

ADL在某些特定情況下是有利的,例如運營商重載和可交換概念。但是,它應該謹慎使用,因爲在許多其他情況下它會導致bizarre, unexpected behavior

+0

嗯..等等,但是像'swap'這樣的東西,在std命名空間和類中都定義了它呢?那不需要'使用std :: swap;'?我的例子中的錯誤在哪裏? (我的看起來很像[這裏](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)。) – Mehrdad 2012-02-12 05:47:33

+0

在你的例子中,唯一可用的'foo'是從'some_namespace ',所以沒有'foo'可以通過ADL找到。 – 2012-02-12 05:50:06

+0

@Mehrdad:您發佈的代碼比較合格與非合格的電話。雖然第一個可能涉及ADL,但它仍然不是「ADL」。是的,使用''''和ADL一起使用是常見的,但是你不能將它與合格的調用進行比較,因爲它是一個完全不同的功能。 – ybungalobill 2012-02-12 05:51:04