C++模板:字节/引用相互干扰



这是我的问题的简化版本。我有一个财产类。它有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,取operator T&。这种方式还将修复对W的调用以获得一个非常数引用。您也可以从其他返回常量引用

operator T const&() const { return v; }
operator T&() { return v; }

这种方式仍然更喜欢Q的第二个转换函数,但如果对象a是const,并且初始化了const引用,则并不总是需要复制v

最新更新