我检查了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 时)在任何情况下都是错误的。
答案 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,则无法执行此操作。不管这个是个好主意(或者你应该让状态变得可变)是另一个问题。