何时实现非常量强制转换运算符

When to implement a non-const cast operator

本文关键字:转换 运算符 常量 实现 非常 何时      更新时间:2023-10-16

我检查了StackOverflow(尤其是强制转换运算符-const vs non-const)和用户定义转换-cppreference.com上的问题,但没有发现非常量版本的有用示例。

在哪些情况下,非常量强制转换运算符有意义?


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

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

在编译器提醒我这一点后,我很好奇这(当返回右值时)在任何情况下是否都是错误的。

一个可行的原因是强制转换运算符不返回值,而是返回某种引用;您不希望强制转换违反要强制转换的对象的任何const性质。

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

在我的经历中,我想我记得这样的一个例子,那就是让我们摆脱困境。

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

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

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

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

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,则这是不可能的。这是否是一个好主意(或者是否应该使状态可变)是另一个问题。