繁体   English   中英

C++ 模板:Byval/Reference 相互干扰

[英]C++ Templates: Byval/Reference interfering with eachother

这是我的问题的简化版本。 我有一个属性 class。 它有类似 has_initialized 的数据,我在这个例子中删除了这些数据。

当我调用使用 T 的 function 时,它很好。 但是 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 function 中成员的非 const 引用。

对于您的Q ,您可以使用这两种转换功能。 您可以通过设置一个非常量来使编译器更喜欢其中一个。

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

现在对于Q ,采用operator T& 这种方式还将修复对W的调用以获取非常量引用。 您还可以从另一个返回 const 引用

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM