簡體   English   中英

為什么C ++參數范圍會影響名稱空間中的函數查找?

[英]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可能是ostreamoperator+可能是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM