我的问题很简单。做以下事情是否安全?
不需要任何道德建议,例如"不要命名你的功能交换()!"或者别的,拜托!
file1.hpp
first_level_price
file2.cpp
//header guards here
#include <utility> //includes std::swap and std::move
namespace foo
{
template<typename T>
inline void swap(T& lhs, T& rhs)
{
T temp = std::move(lhs);
lhs = std::move(rhs);
rhs = std::move(temp);
}
}
答案 0 :(得分:4)
这完全取决于T
的类型。
如果swap()
的类型在具有自己的交换的不同命名空间中,则与参数相关的查找将找到不同的T
。否则它将查找当前名称空间。
#include <utility> //includes std::swap and std::move
#include <iostream>
namespace foo
{
template<typename T>
inline void swap(T& lhs, T& rhs) {
std::cout << "foo swap\n";
}
}
namespace foo
{
template<typename T>
void myfun(T a, T b)
{
a += b;
swap(a, b); // Looks for swap using the type T.
// If not found uses the current namespace.
// If not found uses the enclosing namespace.
}
}
namespace baz
{
class X {
public:
X& operator+=(X const& rhs){return *this;}
};
inline void swap(X& lhs, X& rhs) {
std::cout << "Bazz Swap\n";
}
}
int main()
{
baz::X a,b;
foo::myfun(a,b); // finds ::baz::swap()
}
结果:
> a.out
Bazz Swap
>
答案 1 :(得分:2)
它会拨打foo::swap
如果您想使用std::swap(a, b);
实施
std
答案 2 :(得分:2)
是的,当然。首先搜索当前名称空间的非限定名称。
答案 3 :(得分:1)
它会调用foo::swap()
。有一个常见的习语,就是写
using std::swap;
swap( x, y );
通用代码中的。这使得std::swap
实现可以启动。但它也需要考虑swap()
个函数,这些函数可以通过依赖于参数的查找(ADL)在其他命名空间中找到。因此,如果某个函数foo::swap
且x
或y
的类型位于namespace foo
中,则会调用此foo::swap
,如果它是更好的匹配比std::swap
。