gpt4 book ai didi

C++在 namespace 中声明与全局 namespace 中的函数同名的函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:15 26 4
gpt4 key购买 nike

我对 C++ 中的函数声明范围有疑问。假设使用 #include <cmath>在全局命名空间中引入一个函数符号。按照我的理解,原则上应该只在std中引入符号。命名空间,但实际上,根据我自己的经验,一些符号出现在全局命名空间中。这个答案似乎证实了这一点:cmath header confusion .

现在,当我在 namespace foo { } 中声明一个函数(具有与全局命名空间中的函数相同的原型(prototype))时会发生什么? ?例如,假设 sqrt()来自 <cmath>最终出现在全局命名空间中,我有:

#include <cmath>

namespace foo {

template <class T>
T sqrt( T x ) {
// do something extra...
return std::sqrt( x );
}

}

// ...

void foo::bar() {
double a = 4.0;
double b = sqrt( a );
}

模板解析为符号double sqrt( double x ) ,这似乎应该与全局 namespace 中的冲突。这似乎可行,但这通常是一种不好的做法吗?

更一般地说,在同一命名空间内使用时,在命名空间内声明的函数是否优先于全局函数?这是否以任何方式违反了 C++ 标准?

最佳答案

这里有两个不同的问题。

首先,拉入某些 header 确实会在全局命名空间和 std 命名空间中注入(inject)符号。这种香肠制作与 C++ 在 C 中的遗产和根源有关;并尝试尽可能少地用 C++ 编译遗留 C 代码。

其次,这是真的......

a function declared inside a namespace take precedence over a global function, when used from inside the same namespace?

没错。而且,不,这不是

violate the C++ standard in any way?

事实上,C++ 标准明确规定这是事情应该如何工作的。解析来自 namespace 的引用首先搜索相同的 namespace ,作为第一项业务。然后是父命名空间,如果是嵌套命名空间。然后,最终是全局命名空间。

然后,使用命名空间 使事情变得复杂。这就是为什么 you should not do that .

最后,为了让事情变得有趣,还有 argument dependent lookup通过搜索不在当前命名空间、父命名空间或全局命名空间中,但在与函数参数相同的命名空间中的函数,颠覆了所有这些规则。

从来没有人指责 C++ 简单。

关于C++在 namespace 中声明与全局 namespace 中的函数同名的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686797/

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