Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板分配运算符不使用';t替换默认的赋值运算符 在C++模板中,第5.3部分成员模板中的完整指南:_C++_Templates - Fatal编程技术网

模板分配运算符不使用';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;
}