我正在构建一个引用计数系统,并定义了一个原型模板类,它表示对将要使用的对象的所有引用。
我被困的地方是我必须通过引用区分const和非const访问这些对象。如果访问是const(只读或被调用的底层对象方法被标记为const),一切都没问题 - 但如果不是 - 可能必须首先创建对象的副本。
我的参考类的简化版本:
template< class T >
class CRef
{
protected:
T* ptr;
public:
T* const* operator ->() const { return ptr; };
T* operator ->() { printf( "Non-const access!" ); return ptr; };
};
问题是,只有非const - >即使在访问底层对象类型的const函数时,也会调用operator重载函数。
答案 0 :(得分:2)
const
/ non-const不能用于区分读写访问。
operator ->
返回的代理对象,并通过隐式转换处理读取:
返回的代理定义了operator T
(隐式转换),当它被分配给另一个对象时被调用,而operator =(T const&)
被分配给它时。
template <typename T>
class CRef {
…
CRefElementProxy<T> operator ->() const { return CRefElementProxy<T>(this); };
friend CRefElementProxy;
};
template <typename T>
class CRefElementProxy {
operator T const*() const { return parent->ptr; }
CRefElementProxy operator =(T const* value) {
printf("Non-const access!");
return parent->ptr;
}
};
这只是一个伪代码草案。真实版本看起来有点复杂。
答案 1 :(得分:2)
在const对象上调用const。如果你想要const - &gt;调用,将您拥有的对象引用转换为const或提供获取对象的const版本的方法。
答案 2 :(得分:1)
一旦返回指针,就无法知道用它做了什么。