using namespace std;
template<class T> struct A {
A(const T& t1, const T& t2) noexcept { } //1
A(T&&, T&&) {} //2
};
template<class T> A(const T&, const T&)->A<T&>; //3
template<class T> A(T&&, T&&)->A<T>; //4
int main()
{
int i=0;
A a(i,i);
}
编译无法通过,显示A的构造函数重定义,分析过程,A传入两个int变量,根据c++17的新语法,未指定模板类型的情况下根据构造函数推导模板类型,此时有两个构造函数1和2,由于同时存在模板类型自定义推导3和4,所有优先根据3和4推导类型,传入的为左值,虽然此处4可以通过折叠引用接受左值变量,但3是最优匹配,于是最终推导出模板类型为A<int&>.
问题就出在这,代入T=int&后发现两个构造函数是完全相同的,其中1的形参为(const int& & ,const int& &),而引用的const还是引用,最终就是(int&,int&),而2的形参由于引用折叠也是(int&,int&),自然无法通过编译。