来自 C# 背景,我习惯于使结构不可变的做法。
因此,当我开始使用 C++ 编程时,我尝试对通常通过value传递的类型做同样的事情。
我有一个简单的结构,它代表一个自定义索引并简单地包装一个整数。因为在 C++ 中的const
关键字有点类似于readonly
在 C# 中,所以像这样实现我的结构似乎是合理的:
struct MyIndex
{
MyIndex(int value) :
Value(value)
{
}
const int Value;
};
这种方法的问题在于,该结构的行为与 C# 中的不可变结构完全不同。不仅MyIndex
不能修改变量的Value字段,而且任何现有的变量(局部变量或字段变量)甚至都不能用另一个-instanceMyIndex
替换。MyIndex
因此以下代码示例无法编译:
a) 使用索引作为循环变量。
MyIndex index(0);
while(someCondition)
{
DoWork();
index = MyIndex(index.Value + 1); // This does not compile!
}
b) 修改成员字段类型MyIndex
class MyClass
{
MyIndex Index;
void SetMyIndex(MyIndex index)
{
Index = index; // This does not compile!
}
};
这两个示例不编译,构建错误是一样的:
错误 C2582:“操作员 =”功能在“MyIndex”中不可用
这是什么原因?为什么变量不能用另一个实例替换,尽管它们不是const
?构建错误意味着什么?那是什么operator =
功能?