C++17 模板类 类型自动推导的一个小问题

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&),自然无法通过编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值