C ++: - &;运算符重载:以不同方式处理const /非const访问

时间:2011-03-31 18:18:51

标签: c++

我正在构建一个引用计数系统,并定义了一个原型模板类,它表示对将要使用的对象的所有引用。

我被困的地方是我必须通过引用区分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重载函数。

  • 如何获得常量解引用重载功能以便正确调用?

3 个答案:

答案 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)

一旦返回指针,就无法知道用它做了什么。