C ++模板:相互干扰的Byval /引用

问题描述

|| 这是我的问题的简化版本。我有一个财产课。它具有has_initalized之类的数据,在本示例中我将其删除。 当我调用使用T的函数时,它很好。但是T&不是,所以我决定写一个T&版本。但这会导致所有使用普通T的函数得到编译错误。为什么T&会干扰呢?对于此示例,如何在不更改main()的情况下使两个函数(Q和W)正常工作?
template <class T>
class Property {
    T v;
    Property(Property&p) { }
public:
    property() {}
    T operator=(T src) { v = src; return v; }
    operator T() const { return v; }
    operator T&() const{ return v; }
    T operator->() { return v; }
};

class A{};

void Q(A  s){}
void W(A& s){}

int main(){
    Property<A> a;
    Q(a);
    W(a);
}
    

解决方法

        C ++的重载规则中没有任何内容允许编译器在对Q的调用中选择
operatorT()
operatorT&()
operator T() const { return v; }
也将消除歧义。但是,这将带来一个问题,因为无法在const函数中返回对成员的非const引用。     ,        对于
Q
,可以同时使用两种转换功能。您可以通过使一个非常量来使编译器优先于另一种。
operator T() const { return v; }
operator T&() { return v; }
现在对于
Q
,取taken7ѭ。这样也可以将调用固定为
W
以获得非常量引用。您还可以从另一个返回const引用
operator T const&() const { return v; }
operator T&() { return v; }
这样,仍将首选用于
Q
的第二个转换函数,但是如果对象
a
是const且您初始化了const引用,则不一定总是需要复制
v
。