罗列C++语言中一些不太引人注意的细节

Argument dependent name lookup (又称作Koening name lookup)

它的含义是指,对于未通过命名空间限定的函数调用(英文叫unqualified),编译器会参照各个参数所在的命名空间,去查找相应函数的定义和声明。将起来太抽象,举个例子

#include <iostream>
  
  namespace Layer1 {
  
      class ClassInLayer1
      {   
      public:
          ClassInLayer1() = default;
      };  
      void foobar(ClassInLayer1 c) { std::cout << "foobar in Layer 1" << std::endl;}
  };
  
  namespace Layer2 {
      class ClassInLayer2
      {   
      public:
          ClassInLayer2() = default;
      };  
      void foobar(ClassInLayer2 c) { std::cout << "foobar in Layer 2" << std::endl;}
  }
  
  int main()
  {
      Layer1::ClassInLayer1 c1; 
      Layer2::ClassInLayer2 c2; 
      foobar(c1);
      foobar(c2);
      return 0;
  }

可以看到,main函数中有两个foobar的函数调用,其中一个的入参是Layer1::ClassInLayer1,而另一个是Layer2::ClassInLayer2。虽然这两个foobar都没有用命名空间去限定(完整的写法应该是Layer1::foobar(c)),此时编译器会根据入参所在的命名空间,去寻找相应的函数定义。程序的输出是

ken@ken-N56VZ ~/Documents/trialInferno/C++ $ ./a.out
foobar in Layer 1
foobar in Layer 2

猜你喜欢

转载自www.cnblogs.com/ninja-ken/p/11068454.html