gpt4 book ai didi

c++ - ADL 不查找静态成员函数吗?

转载 作者:可可西里 更新时间:2023-11-01 18:36:02 33 4
gpt4 key购买 nike

这是来自 Does argument dependent lookup only search namespaces or classes too? 的跟进问题,其中@David Rodríguez 说“ADL 将查看类型的封闭命名空间,以及类型本身的内部”。我可能把他想说的话弄错了,但我正在尝试这个例子:

struct foo{
static void bar(foo* z){}
};

int main(){
foo* z;
bar(z);
}

它不编译,产生错误“'bar' was not declared in this scope”。是不是ADL没有考虑静态成员函数?。我的意思是在示例中关联的类是 foo 那么 ADL 不会查看类内部吗? .谁能简化这里的规则?

最佳答案

他大概是这个意思:

struct foo{
friend void bar(foo* z){} //not static, its friend now
};

foo* z;
bar(z); //fine now

但从技术上讲bar()不在里面 foo .它仍然foo 的封闭命名空间中.

--

编辑:

他的意思确实是friend , 作为 he said (强调我的):

The best example is a friend function that is defined inside the type

他的例子进一步说明了这一点。可能您需要阅读“内部定义”,而不仅仅是“内部”。

“定义”这个词是唯一的区别,因为它看起来函数的名称 bar被引入类的范围,但实际上,名称 bar被引入到 foo 的封闭命名空间中(参见 §3.3.1/3-4 和 §11.3/6)。

这是一个更好的例子:

namespace Demo
{
struct foo
{
friend void bar(foo* z){}
};
}

foo *z;
bar(z); //foo (type of z) is inside Demo, so is bar
//(even though bar is defined inside foo!)

bar(NULL); //error - NULL doesn't help ADL.
bar(nullptr); //error - nullptr doesn't help ADL.

bar(static<foo*>(NULL)); //ok - ADL

注意名字bar , 即使被引入命名空间 Demo , 是隐藏的,因此不能通过通常的名称查找从外部使用:

using namespace Demo; //brings ALL (visible) names from Demo to current scope

bar(NULL); //STILL error - means bar is invisible

或者,

Demo::bar(NULL);       //error - not found
Demo::foo::bar(NULL); //error - not found

希望对您有所帮助。

关于c++ - ADL 不查找静态成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14725214/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com