[当有人写了]时>
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的语义是否存在某种约定或经验法则?
注意:
我特别忽略了指针,您也可以在答案中忽略它们(如果愿意,也可以不忽略它们。)>[有人编写了模板
这个问题将更适合程序员。stackexchange.com,但没关系。
并且如果某些内容确实发生了变化(例如易变),您应该换个角度看,因为它不起作用。