在命名空间foo中声明swap()然后在同一名称空间下使用swap()而不是foo :: swap()意味着foo :: swap()吗?

时间:2016-01-04 19:54:06

标签: c++ c++11 namespaces

我的问题很简单。做以下事情是否安全?

不需要任何道德建议,例如"不要命名你的功能交换()!"或者别的,拜托!

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);
    }
}

4 个答案:

答案 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::swapxy的类型位于namespace foo中,则会调用此foo::swap,如果它是更好的匹配比std::swap