gpt4 book ai didi

c++ - 带有模板特化的运算符重载

转载 作者:行者123 更新时间:2023-12-02 10:30:02 25 4
gpt4 key购买 nike

This is one answer i see and got confused
根据此问题的答案,需要进行显式特化,因为如果更改了模板函数,而重载函数没有变化,则重载函数将被静默调用。这令人困惑,因为我想知道这是唯一的用例吗?
因此,就我而言,我是否需要显式特化?
确定要调用哪个函数的编译器逻辑是什么?是否同时查看两者,并且如果调用仅与模板A&operator =(const T&x)匹配,它将使用它;否则,它发现输入是operator =(const A&x),它在带有模板的那个上使用这个?由于除了模板类型外,这两个函数还具有相同的签名。因此,如果模板是在编译时推导的,那么我将拥有两个具有相同签名的函数。这就是为什么我感到困惑。是否有用于重载函数/运算符的vtable?当我叫A a时,它用来确定op2优于op1的内容; a b; a = b?

template<typename T>
class A{
public:

explicit A(T x=0, uint32_t others=1) :
m_obj((int64_t)x), m_others(others) {}

// op1
A(const A& x) :
m_obj(x.m_obj),
m_bitWidth(x.others) {
}

//op 2
A& operator=(const T& x) & //for lvalue assignment
{
m_obj = x;
return *this;
}

A& operator=(const A& x) { //specialized? overload? for A type objects
if(x != this) {
m_obj = x.m_obj;
m_others = x.m_others;
}
return *this;
}
double m_obj;
double m_others;

};
我有operator =(T&x)和operator =(const A&x)的原因是因为我希望能够执行以下操作:
A<int> a;
A<int> b(10,20);
int c = 10;

a = b;
a = 10;

所以我的问题是:
  • 我的重载运算符应该有显式的特化吗?
  • 如果不需要显式特化,那么显式特化到底是什么?有哪些用例?
  •     template<>
    A& operator=(const A& x) { //specialized? overload? for A type objects
    if(x != this) {
    m_obj = x.m_obj;
    m_others = x.m_others;
    }
    return *this;
    }
    编辑

    最佳答案

    A<T>::operator=(const T&) &是模板化的(因为它是类模板的一部分),但是它是而不是模板。因此,不可能对其进行专门化处理(“作为A的成员”除外,这种情况很少见且无关紧要)。 A的每个特化都有两个赋值运算符;请注意,因为T是模板而不是类型,所以A不可能是A(并且会导致两个运算符之间发生冲突)。 (也不能构造自引用类型A<A<A<…>>>。)正常的重载解析用于每个分配,以确定要调用的分配。
    还要注意,您的A<T>::operator=(const A&)几乎与(如果您将其省略但又声明为)完全相同。 (声明另一个并不能阻止:所有类都具有副本分配运算符。)

    关于c++ - 带有模板特化的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62582730/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com