当我写一个类时,是制作不可变类还是只使用const
关键字总是一个大问题。
我来自 Objective-C,当我使用 Objective-C 时,可变/不可变约定是分开的。这主要是因为缺乏const
像 C++ 中的语义,但它也保证了对象的不变性,尤其是当不可变对象被复制到可变对象时我可以捕获。所以我可以将共享状态用于不可变对象,并且仅在将状态复制到可变对象时才复制状态。
在 C++ 中,有const
语义,所以我尝试用它设计一个容器,但我有一些问题。这是示例代码。
struct Foo
{
int bar;
};
Foo const f1;
Foo f2 = f1; // This is allowed but...
f1
允许从to复制分配f2
,并且不会产生任何警告或错误。问题是我无法捕获将不可变对象复制到可变对象的情况。当我编写一个复制赋值构造函数时,它既适用于可变对象,也适用于不可变对象。我想让不可变对象使用共享状态,并且只有在将其复制到可变对象时才会复制它。
写时复制不适合我,因为我的容器代码应该适合实时程序。绩效影响必须是可见的,并且位置应该是可预测的。不允许写时复制,因为它会将复制成本推迟到不可预测的时间点。复制成本必须可见。
这可以通过为每个不可变/可变对象创建单独的对象来解决,但我不确定这是 C++ 的良好设计。
使用可见复制成本制作不可变/可变类的推荐模式是什么?我认为如果我可以将一些复制构造函数从 immutable 变为 mutable ,这可以解决,但我找不到任何方法。