何时实现非const转换运算符

时间:2014-08-27 12:32:59

标签: c++ operator-overloading const typecast-operator

我检查了StackOverflow上的问题(特别是casting operator - const vs non-const)和user-defined conversion - cppreference.com,但我没有找到非const版本的有用示例。

在哪种情况下非常规运算符有意义?


后台(编辑):针对平面内存布局的可选模板类的简单实现引发的问题。在这里,我希望对包含的类型进行隐式转换,我的第一种方法是这样的(没有const):

    template <typename T>
    class Optional
    {
    public:
        operator T() { return value; }
        // ...
    private:
        T value;
        // ...
    };

在编译器提醒我之后,我很好奇是否(在返回 rvalue 时)在任何情况下都是错误的。

3 个答案:

答案 0 :(得分:3)

一个可行的原因是当演员操作员没有返回一个值,而是某种类型的引用时;你不希望演员表违反正在施放的物品的任何const -

class Type {
  HANDLE h;
public:
  operator HANDLE const&() const {
    return h;
  }
  operator HANDLE&() { // possibly want the non-const as well
    return h;
  }
};

根据我的经验,我想我记得有一个例子就是让我们摆脱困境。

答案 1 :(得分:2)

显而易见的答案是转换为左值:

class MyInt
{
  int m;

public:
  operator int& () { return m; }
  operator int () const { return m; }
};

除此之外,我想不出任何具体的例子。我想在一些领域特定语言中可能有意义,整个C ++类型系统只是提供一些语法的工具。

答案 2 :(得分:1)

在调用强制转换运算符时,您可能需要更改对象的内部状态:

class CounterInt {
private:
  int m_value;
  int m_state;
public:
  CounterInt(int val) : m_value(val), m_state(0) {}
  operator int() {
    ++m_state;
    return m_value;
  }
  int getState() {return m_state;}
};

如果您的强制转换操作符是const,则无法执行此操作。不管这个是个好主意(或者你应该让状态变得可变)是另一个问题。