何时实现非常量强制转换运算符
When to implement a non-const cast operator
我检查了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,则这是不可能的。这是否是一个好主意(或者是否应该使状态可变)是另一个问题。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?