普通的函数查找OL和ADL(koening)查找的优先级一样吗

GoForSky 2013-06-23 01:50:08

请问
1:普通函数查找和ADL(koening)查找的优先级一样吗???

2:普通函数查找的时候,一层一层查找函数,找到就停止,一直到全局函数;
那koenig是否也会一层层向更大的作用域查找呢,直到全局呢???

比如:
//-------------------------------------------------------------
// f.h
namespace N
{ name space N_1
{
class X{};
void f(X para){}
}
void f1(X para);
}

void f2(X param)
{}

//-------------------------------------------------------------
#include f.h

void main()
{
X test_x;
f(test_x); //没问题
f1(test_x); //标准的C++可以吧?koenig查找参数所在空间的上一层,可以吗??
f2(test_x); //标准的C++可以吧?koenig查找参数所在空间的全局域,是这样吗?
}
...全文
212 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
小龙~ 2014-03-12
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
1. 根据写法不同, 要么启用 ADL, 要么禁用 ADL, 不存在 2 者比优先级吧. 注意 ADL 只是扩大了搜索范围, 并不是把搜索范围限定到只根据参数来查找. 2. 不会查找参数空间的上一层的. 所以 f1(test_x); 是不行的. f2(test_x); 可以, 但不是通过参数空间去查找全局域, 而是本身函数就会查找全局域.
根据写法启用和禁用,而是根据OL先从哪个域找到,如果先从类域找到就会不启用ADL,如果是类域以为就会启用ADL
ri_aje 2013-06-23
  • 打赏
  • 举报
回复
引用 6 楼 GoForSky 的回复:
[quote=引用 5 楼 ri_aje 的回复:] 如果 unqualified lookup 找到以下三者之一 — a declaration of a class member, or — a block-scope function declaration that is not a using-declaration, or — a declaration that is neither a function or a function template 则 adl 无效。
这是哪本书上的。我在几本经典书上都没看到[/quote] it's in c++11 3.4.2/3
taodm 2013-06-23
  • 打赏
  • 举报
回复
不要多花精力研究这些规则。 凡是要这么啃规则代码,都可以称为垃圾代码的。 精力多花在有用的地方吧。
GoForSky 2013-06-23
  • 打赏
  • 举报
回复
引用 6 楼 GoForSky 的回复:
[quote=引用 5 楼 ri_aje 的回复:] 如果 unqualified lookup 找到以下三者之一 — a declaration of a class member, or — a block-scope function declaration that is not a using-declaration, or — a declaration that is neither a function or a function template 则 adl 无效。
1: a declaration of a class member,成员函数优于ADL,我知道。 3: a declaration that is neither a function or a function template,不是函数也不是函数模板,那只能是变量了,在这里无关函数查找 2: a block-scope function declaration that is not a using-declaration。 块作用域内的声明???什么意思 这些是那本经典上的?
GoForSky 2013-06-23
  • 打赏
  • 举报
回复
引用 5 楼 ri_aje 的回复:
如果 unqualified lookup 找到以下三者之一 — a declaration of a class member, or — a block-scope function declaration that is not a using-declaration, or — a declaration that is neither a function or a function template 则 adl 无效。
这是哪本书上的。我在几本经典书上都没看到
ri_aje 2013-06-23
  • 打赏
  • 举报
回复
如果 unqualified lookup 找到以下三者之一 — a declaration of a class member, or — a block-scope function declaration that is not a using-declaration, or — a declaration that is neither a function or a function template 则 adl 无效。
GoForSky 2013-06-23
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
f1 找不到,其他的都行,因为 associated namespace 不考虑外层 namespace。 一般情况下 adl 和 unqualified name lookup 没有优先级之分,不过标准给出了三种情况,unqualified name lookup 此时比 adl 更优先。
不过标准给出了三种情况,unqualified name lookup 此时比 adl 更优先。 那三种情况????
GoForSky 2013-06-23
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
http://bbs.csdn.net/topics/390497814
1. 根据写法不同, 要么启用 ADL, 要么禁用 ADL, 不存在 2 者比优先级吧. 注意 ADL 只是扩大了搜索范围, 并不是把搜索范围限定到只根据参数来查找. 2. 不会查找参数空间的上一层的. 所以 f1(test_x); 是不行的. f2(test_x); 可以, 但不是通过参数空间去查找全局域, 而是本身函数就会查找全局域.


//f.h
namespace N
{   namespace N_1
    {  
        class X{};
        void f(X para){}
    }
    void f1(N_1::X para);   
}
 
void f2(N::N_1::X param)
{}

#include "f.h" 

using namespace N::N_1;
int main(int argc, char *argv[])
{
   X test_x;
   //f(test_x);       //没问题
   //f1(test_x);      //标准的C++可以吧?koenig查找参数所在空间的上一层,可以吗??
   f2(test_x);        //标准的C++可以吧?koenig查找参数所在空间的全局域,是这样吗?
   
   return 0;
}

DevCpp 2012.11,测试确实如此。f1,查不到,不会在namespace,自动向上查找; exceptional C++ 条款34有论述,只是说某个函数会在std中查询,查询不到,然后转到上一层,就是全局域查。我感觉exceptional C++ 中,Herb Scutter讲述的有点零散,不是很好。
ri_aje 2013-06-23
  • 打赏
  • 举报
回复
f1 找不到,其他的都行,因为 associated namespace 不考虑外层 namespace。 一般情况下 adl 和 unqualified name lookup 没有优先级之分,不过标准给出了三种情况,unqualified name lookup 此时比 adl 更优先。
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
1. 根据写法不同, 要么启用 ADL, 要么禁用 ADL, 不存在 2 者比优先级吧. 注意 ADL 只是扩大了搜索范围, 并不是把搜索范围限定到只根据参数来查找. 2. 不会查找参数空间的上一层的. 所以 f1(test_x); 是不行的. f2(test_x); 可以, 但不是通过参数空间去查找全局域, 而是本身函数就会查找全局域.

64,746

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧