[英]Why does C++ parameter scope affect function lookup within a namespace?
這對我來說似乎有點倒退,但是它起作用:
#include <iostream>
namespace nTest
{
struct cTest {};
void fTest(cTest& x)
{
std::cout << "nTest::fTest(cTest&) called" << std::endl;
}
}
int main(void)
{
nTest::cTest x;
fTest(x); //Weird! fTest is resolved since its parameter belongs to nTest.
return 0;
}
通常,您需要nTest ::才能訪問fTest,但是它的屬於nTest的參數似乎會將nTest添加到可能要搜索fTest的范圍的列表中。 參數范圍影響功能查找對我來說似乎很奇怪。
這在GCC中可以正常編譯,但是我想知道這種用法是否可移植? 此作用域機制的正式定義是什么?
那就是ADL(依賴於參數的查找)或Koenig查找(用於功能的設計者)。 該功能的目的在於,在許多情況下,相同的名稱空間將包含可應用於這些類型的類型和函數,所有這些類型和函數都符合接口 。 如果沒有ADL,則必須using
聲明將標識符納入范圍,否則必須限定調用。
由於該語言允許操作員重載,因此這成為一場噩夢。 考慮以下示例:
namespace n {
struct test {};
test operator+( test, test const & ); // implemented
};
int main() {
n::test a,b;
n::test c = a + b; //without ADL: c = n::operator+( a, b )
}
盡管這看起來很尷尬,但請考慮n
可能是std
命名空間, test
可能是ostream
, operator+
可能是operator<<
:
int main( int argc, char** ) {
std::cout << "Hi there, there are " << argc << " arguments" << std::endl;
}
如果沒有ADL,則對operator<<
的調用必須是明確的,此外,您還必須知道其中的哪些是通過自由函數而非方法實現的。 您是否知道std::cout << "Hi"
正在調用一個自由函數,而std::cout << 5
正在調用一個成員函數? 沒有多少人意識到這一點,而且認真的是,幾乎沒人在乎。 ADL對您隱藏了這一點。
它稱為Koenig aka自變量依賴查找http://en.wikipedia.org/wiki/Argument-dependent_name_lookup
它最初旨在查找重載運算符,例如用於將字符串發送到std :: cout的operator <<。 如果我們沒有ADL,則必須編寫這樣的代碼: std::operator<<(std::cout, "nTest::fTest(cTest&) called")
。
不太好!
如果對操作員有效,為什么不對功能使用相同的方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.