最近的讨论引出了这个问题:
C++中是否存在不可变容器?或者,由于C++更喜欢使用迭代器而不是通用容器,是否存在不可变迭代器?
我说的是类似于Guava的ImmutableList
或内置的Collections.unmodifiable*
方法的等效物。明确地说,这两种类型的集合非常不同-前者本质上是不可变的,而后者只有在获取不可修改引用的演员才是不可变的,但是可能会被访问未包装对象的演员修改。
我想知道是否存在与ImmutableCollection
相当的标准化(实际或事实上,如Guava):
- 任何演员都无法修改的集合。此外,接受此类型的函数提供的文档说明它们不能且不会修改作为参数接收或作为返回值返回的这些集合。
或者像ret ro = Colletions.unmodifiableCollection(orginalCollection)
(以及相关方法)一样的东西:
- 与上述略有不同,这是原始集合的 视图,任何持有
originalCollection
的人都可以修改它,但持有返回值ro
的人却不能。通常情况下,它通过在代理中包装原始集合来实现,从而防止任何修改,但也可能有其他实现方式。
我非常了解 const std::iterator
和朋友们,但这是非常不同的 - 它确保调用者可以将对象传递给被调用方,并且该对象不会被修改,但它并不保证被调用方不会修改该对象。
现在我是一个资深的 C++ 用户,虽然过去 5 年里没有用过,但我无法想出明显的等效物。
mcc
对象完全可变,只是不能由获取mcc
引用的调用方进行更改!特别是,mcc
是可变的,因为mc
是可变的。想象一个方法,它接受一个const Cow
参数,假设它是不可变的,并且缓存跨多个cow对象的状态,例如名称。如果更改了cow的名称,则会在上面的示例中失败。 - BeeOnRopeCow
必须是const
正确的。如果你不希望在创建后Cow
发生状态变化,那就不要去改变它... 在我的例子中,绝对没有办法在构造之后改变Cow
的名称... 如果你的类有可以改变其状态的函数或者可变成员,则必须提供一个const
正确的包装器... 或者我还是漏掉了什么吗? - WhiZTiMCow
是一个不可变对象(它根本没有可变方法),但是想象一下它是可变的但是符合const - 调用者可以将其作为const
Cow传递给任何方法,它仍然是可变的。我的问题特别关于集合,以及C++中是否存在不可变集合。已经清楚地知道可以创建“常量Cow”对象。 - BeeOnRopeCow
是可变的const
(const
不正确),为什么不提供一个const
正确的包装器呢?但是回答你重申的问题。我不知道有“这样”的容器,也没有在C++中遇到过这样的容器,C++中的const
概念与Java的不同,据我所知。 - WhiZTiM