首页 > 编程语言 > 详细

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

时间:2019-06-22 12:52:55      阅读:113      评论:0      收藏:0      [点我收藏+]

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

 

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

原文:https://www.cnblogs.com/ninja-ken/p/11068454.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!