gpt4 book ai didi

c++ - 标准库/模板容器的 const 语义的经验法则?

转载 作者:太空狗 更新时间:2023-10-29 23:00:14 24 4
gpt4 key购买 nike

当有人写了一个

template <typename T> class Container;

很明显当你有一个 const Container<const MyType> 时会发生什么(嗯,假设你知道 const'ness 对 MyType 意味着什么)。您不能更改任何内容——不能重新排序结构,不能添加或删除元素,不能更改现有元素;如果引擎盖下确实发生了某些变化(例如 mutable),您应该换个角度看,因为它不算数。

Container<MyType> 的意思也很清楚- 一切都是可变的(除了可变类中的 const 成员等)

如果将常量与非常量混合在一起,事情就会变得困惑。与 const Container<MyType> - 期望修改 MyType 是否合理?元素?如果容器的状态取决于它们的值怎么办?另外,如果我有

using Stuff = Container<MyType>;

然后我绕过 const Stuff参数。这种不透明的措辞让你怀疑你是否“应该”改变 Stuff 元素中的任何东西;毕竟,你不能说“在const 上深Stuff 并且不要触摸那里的任何东西”。没有人喜欢写作:

using ConstStuff = Container<const MyType>;

然后通过尴尬的const ConstStuff大约。然而,std 容器完全(?)能够与 const 共存为他们自己而不是为他们的元素。

甚至是 Container<const MyType> 的语义造成一定的语义问题:您可以删除容器中的项目;并且您可能需要能够复制它们。这不是很 const y 个元素。

最后,当您有多个模板化类型参数时,事情会变得更加困惑。假设现在是

template <typename K, typename V> class Container;

(是的,它就像一个 std::map ,这是这个问题的动机。)有了这个,您可以拥有一个常量容器但可变键 - 荒谬,对吧?你可以通过改变它们来完全搞砸它。或者,假设它是一个带有 const 的容器键但非 const值,并假设它通过不保留相同值的多个拷贝,而是指向该值的单个拷贝来最小化存储。然后你过来改变那个值。

在这些情况下,是否存在关于 const 语义的某种约定或经验法则?

注意:我特别忽略了指针,您也可以在回答中忽略它们(如果您愿意,也可以不忽略)。

最佳答案

这个问题会更适合 programmers.stackexchange.com,但没关系。

and if something does change under the hood (e.g. mutable) you should look the other way because it doesn't count.

不,某些事情可能会合法地改变。因为这个 const Container可能只是一个不可修改的接口(interface),而实现它的人可能已经为自己保留了随意修改它的自由,这完全没问题。谁给你的const Container可能这样做是为了不必实例化新容器,也不必为自己的非常量容器的内容制作安全拷贝。

Things get confusing where you mix constness with non-constness. With const Container - is it reasonable to expect to modify the MyType elements?

嗯,是的。这就是为什么它是 const Container<MyType> 的原因。而不是 const Container<const MyType> . 完全合理。

What if the state of the container depends on their values?

好吧,那时候事情会变得困惑。但这真的很奇怪。 (这就是真正奇怪的事情通常会发生的事情:它们开始变得困惑。)

Even the semantics of Container pose a certain semantic hiccup: You can delete items in the container; and you likely need to be able to make copies of them. That does not make for very consty elements.

不,元素是完全 consty 的,因为通过从 const 对象复制来初始化实例正是复制构造函数所做的,并且因为从容器中移除对象并不意味着需要对其执行任何操作对象,即使对象因从容器中移除而被析构,调用 const 对象的析构函数也完全没问题。

Finally, things get even messier when you have multiple templated type parameters. Suppose now it's template <typename K, typename V> class Container; (yes, it's like an std::map, which is a motivator for this question.) With this you can have a constant Container but mutable keys - ridiculous, right?

是的,这有点荒谬。但是该语言必须为您提供声明具有不可变键和可变值的容器的能力,因此该语言必须提供完成此类事情所需的功能。

除了密切关注常量之外,我不知道还有什么建议。

关于c++ - 标准库/模板容器的 const 语义的经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34232958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com