我对 C++ 中的函数声明范围有疑问。假设 using#include <cmath>
将函数符号引入全局命名空间。根据我的理解,原则上应该只在命名空间中引入符号std
,但在实践中,根据我自己的经验,一些符号会出现在全局命名空间中。这个答案似乎证实了这一点:cmath header chaos。
现在,当我在 a 中声明一个函数(与全局命名空间中的函数具有相同的原型)时会发生什么namespace foo { }
?例如,假设sqrt()
from<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 );
}
模板被解析为 symbol double sqrt( double x )
,这似乎应该与全局命名空间中的那个冲突。它似乎有效,但这通常是一种不好的做法吗?
更一般地说,在同一命名空间内使用时,在命名空间内声明的函数是否优先于全局函数?这是否以任何方式违反 C++ 标准?