【发布时间】:2017-05-31 21:44:33
【问题描述】:
我对 C++ 中的函数声明范围有疑问。假设使用#include <cmath> 将函数符号引入全局命名空间。根据我的理解,原则上应该只在std命名空间中引入符号,但在实践中,根据我自己的经验,全局命名空间中会出现一些符号。这个答案似乎证实了这一点:cmath header confusion。
现在,当我在 namespace foo { } 中声明一个函数(与全局命名空间中的函数具有相同的原型)时会发生什么?例如,假设 <cmath> 中的 sqrt() 最终位于全局命名空间中,而我有:
#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 ),看起来它应该与全局命名空间中的那个冲突。这似乎有效,但这通常是一种不好的做法吗?
更一般地说,在同一命名空间内使用时,在命名空间内声明的函数是否优先于全局函数?这是否违反了 C++ 标准?
【问题讨论】:
标签: c++ scope cmath global-namespace