我怎麼知道我是否應該使用的ADL與範圍分辨率 - 哪個更喜歡?
my_type bar;
using some_namespace::foo;
foo(bar);
代替
some_namespace::foo(bar);
打電話給我的功能foo
(這不是我的眼前範圍內)時?有沒有一個通用的「規則」來確定你是否應該使用ADL?哪一個我應該使用「默認」?
我怎麼知道我是否應該使用的ADL與範圍分辨率 - 哪個更喜歡?
my_type bar;
using some_namespace::foo;
foo(bar);
代替
some_namespace::foo(bar);
打電話給我的功能foo
(這不是我的眼前範圍內)時?有沒有一個通用的「規則」來確定你是否應該使用ADL?哪一個我應該使用「默認」?
這不是ADL。在這兩個示例中,foo
都是通過正常查找找到的。使用ADL將如下的例子:
namespace ns {
class A { };
void f(A) { };
}
int main() {
f(A());
}
這裏,f
不經由正常查找發現,但它是通過參數相關的查找實測值(因爲它是在名稱空間ns
旁邊A
)。無論如何...
儘可能避免ADL。
ADL在某些特定情況下是有利的,例如運營商重載和可交換概念。但是,它應該謹慎使用,因爲在許多其他情況下它會導致bizarre, unexpected behavior。
嗯..等等,但是像'swap'這樣的東西,在std命名空間和類中都定義了它呢?那不需要'使用std :: swap;'?我的例子中的錯誤在哪裏? (我的看起來很像[這裏](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)。) – Mehrdad 2012-02-12 05:47:33
在你的例子中,唯一可用的'foo'是從'some_namespace ',所以沒有'foo'可以通過ADL找到。 – 2012-02-12 05:50:06
@Mehrdad:您發佈的代碼比較合格與非合格的電話。雖然第一個可能涉及ADL,但它仍然不是「ADL」。是的,使用''''和ADL一起使用是常見的,但是你不能將它與合格的調用進行比較,因爲它是一個完全不同的功能。 – ybungalobill 2012-02-12 05:51:04
這兩者都不是ADL。 – ybungalobill 2012-02-12 05:41:32
@ybungalobill:爲什麼?它與[這裏](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Criticism)很相似......錯誤在哪裏? – Mehrdad 2012-02-12 05:48:32
你不能從上下文中取出一段代碼,添加另一段代碼,並假定它有相同的含義。 ADL是行爲特徵,不是句法特徵。即你必須說明在你的程序中聲明瞭什麼'foo'來確定是否在非限定版本中使用了ADL。 – ybungalobill 2012-02-12 05:56:20