为什么我的自定义`:: swap`函数没有被调用?

时间:2018-04-04 08:25:07

标签: c++ templates specialization

在这里,我编写了一个代码片段,以查看将调用哪个swap,但结果都不是。什么都没有输出。

#include<iostream>
class Test {};
void swap(const Test&lhs,const Test&rhs)
{
    std::cout << "1";
}

namespace std
{
    template<>
    void swap(const Test&lhs, const Test&rhs)
    {
        std::cout << "2";
    }
    /* If I remove the const specifier,then this will be called,but still not the one in global namespace,why?
    template<>
    void swap(Test&lhs, Test&rhs)
    {
        std::cout << "2";
    }
    */
}
using namespace std;

int main() 
{
    Test a, b;
    swap(a, b);//Nothing outputed
    return 0;
}  

哪个swap被称为?在另一种情况下,为什么没有swap说明符的专用const被调用,而不是::swap

1 个答案:

答案 0 :(得分:13)

std::swap()类似[ref]

template< class T >
void swap( T& a, T& b );

这是比你的

更好的匹配
void swap(const Test& lhs, const Test& rhs);

swap(a, b);

ab 非常量 。因此调用std::swap(),不输出任何内容。

请注意std::swap()由于using namespace std;而参与重载解析。