c++引用作为函数参数问题

#include
using namespace std;

template void swap(T &a,T &b){
T temp;
temp = a;
a = b;
b = temp;
}

int main(){

char s1[] = "Hello",s2[] = "hi";


swap(s1,s2);//为什么这样写不对

}

因为char[6]和char[3]不能用你的模板T表示,它们也不是一个类型

#include<iostream> 
using namespace std; 
template <class T> 
void swap(T &a,T &b){
    T temp;
    temp = a;
    a = b;
    b = temp;
}

int main(){

    string s1 = "Hello", s2 = "hi";

    swap(s1,s2);
    cout << s1 << endl << s2;
}

数组类型的交换怎么可以直接用等于号赋值呢

#include <type_traits>
using namespace std;

namespace MyNamespace
{
    template <typename T, typename = enable_if_t<is_assignable_v<T&, T>>>
    void swap(T& a, T& b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    template <typename T, size_t N, typename = enable_if_t<is_assignable_v<T&, T>>>
    void swap(T(&a)[N], T(&b)[N])      
    {
        for (size_t i = 0; i < N; ++i)
            swap(a[i], b[i]);
    }

    template <typename T1, typename T2>
    void swap(T1& a, T2& b)
    {
        static_assert(is_assignable_v<T1&, T2> && is_assignable_v<T2&, T1>);  // 静态断言需要c++17
    }

    void example()
    {
        int x = 1, y = 2;
        swap(x, y);

        char s1[] = "s1", s2[] = "s2";
        swap(s1, s2);

        char s3[] = "Hello", s4[] = "hi";
        //swap(s3, s4);     
        //error : 静态断言失败; T1 = char[6],  T2 = char [3]
    }
}

int main()
{
    MyNamespace::example();
}