为什么默认情况下C++类型不是常量?
Why aren't C++ types const by default?
各地的大师都告诉我们const
所有东西,除非我们需要修改它,但标准使所有东西都是可变的,直到我们声明为const
。
我是错过了什么,还是矛盾?为什么C++类型不是默认的const
,而根据专家(其中一些人可能设计了标准(的说法,它们应该是默认的const
?
各地的大师都告诉我们,除非我们需要修改,否则要对一切进行const,
是的,这是一二十年来的传统智慧。
然而,在我们将其声明为const之前,该标准使所有内容都是可变的。
该标准是从大约50年前开发的语言演变而来的,当时常量正确性,甚至类型检查,在很大程度上被认为只是学术兴趣。
我是错过了什么,还是矛盾?
这不是矛盾;只是一种不起作用的语言。你仍然可以(也应该(在适当的时候声明const
,我们只需要忍受一种不会把我们推向安全实践的语言。
为什么默认情况下C++类型不是
const
?
因为更改语言的这样一个基本方面将破坏几乎所有现有的代码。这是一个比稍微减少错误范围更令人担忧的问题。
各地的大师都告诉我们,除非我们需要修改它,否则要对所有东西进行const
这对我来说是有意义的。不变性是一个非常高尚的想法。
Rust是一种新语言(由Mozilla开发(,默认情况下,其中的变量是不可变的。如果您希望变量是可变的,则必须使用关键字mut
显式地使其可变,这与C++的作用完全相反—在C++中,必须使用关键字const
显式地使不可变,否则默认情况下它们是可变的
特别是随着多核处理器和比以往任何时候都多的多线程软件的出现,这让对我来说都更有意义。我认为默认情况下应该有更多的限制,并且应该有意识地、明确地(而不是隐式地(取消限制(当你需要的时候(。例如,一个类的成员默认为private
;继承默认为CCD_ 10。显式地将它们设为public
或protected
。因此,有权修改变量。默认情况下(在我看来(,您不应该有权修改变量。它需要一点成熟才能理解不变性/限制性—通过设置限制,可以避免软件中出现一整类错误。这是我支持该声明的想法。
现在回到实际问题,
为什么C++类型在默认情况下不是const,而根据const人员的说法,它们应该在默认情况下作const?
这是因为
- 没有多少程序员意识到不变性(默认值(让他们的生活变得轻松,因为这是一种新趋势,至少最近它正在迎头赶上
- 向后兼容性。默认情况下,C具有可变类型
几年前我也遇到过同样的问题,我编写了一些辅助函数来使const变量的使用更加简洁。
你可以在这里看到:https://github.com/pthom/cpp_terse_const
我在stackechange上的代码审查帖子:https://codereview.stackexchange.com/questions/106074/const-by-default
小心,这只是一个演习,我不会在生产中使用这个。
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- 常量和非常量类型的相同模板专用化
- 另一个:从"常量类型*"到"类型*"的转换无效
- 派生类中函数参数变化的虚函数按常量类型在"function parameter"会破坏虚拟机制吗?
- 模板和常量类型
- 返回对常量指针的引用,指向常量类型
- 错误:常量类型为c++的单元化成员
- 如何在不重复函数的情况下推导出常量和非常量类型
- JUCE - 成员函数不可行:'this'参数具有常量类型
- 未找到采用常量类型的左操作数的'=='运算符
- 重载全常量类型的复制赋值运算符的正确方法是什么?
- 忽略候选模板:无法将"常量类型参数-0-0 *"与"字符"匹配
- C++中的部分常量类型转换
- 常量类型之间的区别
- 提升::任何构造函数 - 常量类型重载分辨率
- 如何声明模板常量类型
- 编译时生成的常量类型 ID
- 转换为常量类型,初始化数组
- 正在获取模板中的非常量类型
- 如何使用元编程过滤常量类型和非常量类型