模板分配运算符不使用';t替换默认的赋值运算符 在C++模板中,第5.3部分成员模板中的完整指南:
请注意,模板分配运算符不会替换默认值 赋值运算符。对于同一类型的堆栈的赋值 仍然调用默认赋值运算符 这是否正确,因为当我运行以下代码时:模板分配运算符不使用';t替换默认的赋值运算符 在C++模板中,第5.3部分成员模板中的完整指南:,c++,templates,C++,Templates,请注意,模板分配运算符不会替换默认值 赋值运算符。对于同一类型的堆栈的赋值 仍然调用默认赋值运算符 这是否正确,因为当我运行以下代码时: #include<iostream> using namespace std; template<typename T> class Pair { public: T pair1,pair2; Pair(T i,T j):pair1(i),pair2(j){}
#include<iostream>
using namespace std;
template<typename T>
class Pair
{
public:
T pair1,pair2;
Pair(T i,T j):pair1(i),pair2(j){}
template<typename T1>Pair<T>& operator=(Pair<T1>&);
};
template<typename T>
template<typename T1>
Pair<T>& Pair<T>::operator=(Pair<T1>& temp)
{
this->pair1 =temp.pair1*10;//At this point
this->pair2=temp.pair2;
return *this;
}
int main()
{
Pair<int>P1(10,20);
Pair<int>P2(1,2);
P2=P1;
cout<<P2.pair1<<' '<<P2.pair2<<endl;
return 1;
}
#包括
使用名称空间std;
模板
类对
{
公众:
T对1,对2;
配对(ti,tj):配对1(i),配对2(j){}
templatePair&运算符=(Pair&);
};
模板
模板
配对和配对::运算符=(配对和临时)
{
这->pair1=temp.pair1*10;//此时
此->pair2=临时pair2;
归还*这个;
}
int main()
{
PairP1(10,20);
PairP2(1,2);
P2=P1;
cout复制赋值运算符实际上是隐式声明的,并由重载解析来考虑
用户声明的复制分配运算符X::operator=
是
类X
[…]的非静态非模板成员函数。
如果类定义不明确
声明一个复制赋值运算符,隐式声明一个
类X
的隐式声明的复制赋值运算符将
有表格吗
X& X::operator=(const X&)
如果
X
的每个直接基类B
都有一个复制赋值运算符,其参数类型为const B&
,const volatile B&
或B
,以及
- 对于类类型
M
(或其数组)的X
的所有非静态数据成员,每个此类类类型都有一个副本分配
其参数类型为const M&
,const volatile M&
或
M
否则,[……]
正如您可以看到的那样,Pair
的隐式声明的复制赋值运算符有一个类型为Pair const&
的参数-请特别注意const
!如果可以将非const
引用与const
引用绑定到参数,[over.ics.rank]/3:
给出了两个相同形式的隐式转换序列
不可区分的转换序列,除非满足以下条件之一
规则适用于:
-
标准转换序列S1
是比标准转换序列更好的转换序列
S2
if
- [……]
S1
和S2
是参考绑定(8.5.3),以及
除顶级cv限定符外,引用的类型相同,
并且由S2
初始化的引用所引用的类型更多
cv比由S1
参考。
模板的专门化在引用参数中缺少常量,因此它是一个更好的匹配项并被选中。默认赋值运算符接受参数作为常量引用:
您已经定义了一个没有常量的版本,并且您的版本在重载解析的上下文中更好(不需要转换)
尝试:
intmain()
{
PairP1(10,20);
PairP2(1,2);
常数对&x=P1;
P2=x;
我认为当传入一个非常量左值时,Pair&temp
不涉及常量限定,因此它是一个更好的转换序列。这两个赋值运算符都存在于Pair
中,并参与重载解析。因为模板化的运算符采用非常量引用,而隐式声明的运算符采用常量引用在这种情况下,前者更适合。一旦您将模板化的模板更改为接受常量引用,隐式定义的模板将按预期调用。
int main()
{
Pair<int>P1(10,20);
Pair<int>P2(1,2);
const Pair<int>& x = P1;
P2=x;
cout<<P2.pair1<<' '<<P2.pair2<<endl;
return 1;
}