到处都有大师告诉我们,除非需要修改它,否则应该将所有东西都声明为const
,然而标准却将所有东西都变成可变的,直到我们声明它为const
。
我是否漏掉了什么,还是这是一个矛盾之处?为什么C++类型不是默认的const
,根据专家(其中一些人可能设计了标准)的说法,它们应该默认被声明为const
?
到处都有大师告诉我们,除非需要修改它,否则应该将所有东西都声明为const
,然而标准却将所有东西都变成可变的,直到我们声明它为const
。
我是否漏掉了什么,还是这是一个矛盾之处?为什么C++类型不是默认的const
,根据专家(其中一些人可能设计了标准)的说法,它们应该默认被声明为const
?
各种大师都告诉我们,除非需要修改它,否则要将所有东西都声明为const,
这已经是传统智慧了一两个 decade,没错。
然而,标准会使所有东西可变,直到我们声明它为const.
标准从大约50年前开发的语言演变而来,当时const正确性甚至类型检查被普遍认为只具有学术意义。
我是否缺少什么,还是这是一个矛盾?
这不是矛盾,只是一种不按照某些人所说应该的方式工作的语言。在适当的情况下,您仍然可以(而且应该)声明事物为const
,我们只需忍受一种不推动我们朝着安全实践的语言。
为什么C++类型不是默认
const
?
因为改变这种语言的基本特性会破坏几乎所有现有的代码。这比略微减少错误范围更为重要。
const int foo(const int)
这样的东西吗? - 6502各种大师都告诉我们,在不需要修改的情况下,应该把一切东西都声明为const。
这对我来说很有道理,不变性是非常高尚的观念。
Rust 是一个新的语言(由 Mozilla 开发),变量默认情况下是不可变的。如果要使变量可变,则必须使用关键字mut
显式地进行声明,与 C++ 的做法正好相反——在 C++ 中,您必须使用关键字const
显式地将事物声明为不可变,否则它们默认情况下是可变的。
特别是随着多核处理器的出现和比以往更多的多线程软件,这对我来说更有意义。我认为默认情况下应该有更多的限制,并且限制应该在有意识和明确的情况下解除(而不是隐含)。例如,类的成员默认情况下是私有的;继承默认情况下也是私有的。您可以显式地将它们设置为public
或protected
。因此,处理变量的修改权也应是如此。我认为默认情况下不应该有修改变量的权利。需要一些成熟度才能欣赏不变性/限制——通过设置限制,您可以避免软件中的一整类错误。这就是我的思考,以支持这种说法。
现在回到实际问题,
如果根据const人员的说法,类型应该默认为const,那么为什么 C++ 类型默认情况下不是const?
原因是:
几年前,我也有同样的问题,于是我写了一些辅助函数,使const变量的使用更加简洁。
你可以在这里看到它: https://github.com/pthom/cpp_terse_const
以及我在codereview上的帖子: https://codereview.stackexchange.com/questions/106074/const-by-default
注意,这只是一个练习,我不会在生产中使用它。