关于标准库/模板容器的const语义的经验规则?

问题描述 投票:3回答:1

[当有人写了]时>

template <typename T> class Container;

很明显,当您拥有const Container<const MyType>时会发生什么(假设您知道const'ness对MyType意味着什么)。您无法更改任何内容-不能对结构重新排序,不能添加或删除元素,不能更改现有元素;并且如果某些内容确实发生了变化(例如mutable),则应另辟the径,因为它不起作用。

也很清楚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一样,它是此问题的诱因。)有了这个,您可以拥有一个恒定的Container但可变的键-太可笑了吧?您可以通过将它们完全弄乱来弄乱它。或者,假设它是一个具有const键但非const值的容器,并且假设它通过不保留相同值的多个副本,而是指向该值的单个副本来最大程度地减少了存储量。然后您随之改变该值。

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

注意:

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

[有人编写了模板类Container;很清楚当您拥有const Container (假设您知道什么const'ness ...

c++ templates stl const container-data-type
1个回答
1
投票

这个问题将更适合程序员。stackexchange.com,但没关系。

并且如果某些内容确实发生了变化(例如易变),您应该换个角度看,因为它不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.