为什么C++类型默认不是const?

18

到处都有大师告诉我们,除非需要修改它,否则应该将所有东西都声明为const,然而标准却将所有东西都变成可变的,直到我们声明它为const

我是否漏掉了什么,还是这是一个矛盾之处?为什么C++类型不是默认的const,根据专家(其中一些人可能设计了标准)的说法,它们应该默认声明为const


2
我认为这至少源于历史原因,以符合与 [tag:c] 语言的兼容性要求。 - πάντα ῥεῖ
22
同时,在另一种语言中:「默认情况下为什么所有东西都是const,而我需要很多可变状态?」 - syam
它来自于那个美好的时代,当时编程只是为了让事情正常运作。 - Alex F
2
我的观点是,你需要比const对象更多的可变对象。在我看来,默认情况下使用const不会与语言的其他部分很好地配合(例如,在移动语义方面,const默认意味着默认情况下效率低下)。我确实同意const性质是好的,并且是良好设计程序的一个重要组成部分,但我不同意它应该是默认值,这将太不实用了。 - syam
1
这个问题是在谈论自称大师吗? - 6502
显示剩余4条评论
3个回答

18

各种大师都告诉我们,除非需要修改它,否则要将所有东西都声明为const,

这已经是传统智慧了一两个 decade,没错。

然而,标准会使所有东西可变,直到我们声明它为const.

标准从大约50年前开发的语言演变而来,当时const正确性甚至类型检查被普遍认为只具有学术意义。

我是否缺少什么,还是这是一个矛盾?

这不是矛盾,只是一种不按照某些人所说应该的方式工作的语言。在适当的情况下,您仍然可以(而且应该)声明事物为const,我们只需忍受一种不推动我们朝着安全实践的语言。

为什么C++类型不是默认const

因为改变这种语言的基本特性会破坏几乎所有现有的代码。这比略微减少错误范围更为重要。


你是在建议像 const int foo(const int) 这样的东西吗? - 6502
2
@6502:在返回类型上使用“const”没有意义,但是在参数上使用是有意义的。我在谈论你的具体示例。 - Nawaz

16

各种大师都告诉我们,在不需要修改的情况下,应该把一切东西都声明为const。

这对我来说很有道理,不变性是非常高尚的观念。

Rust 是一个新的语言(由 Mozilla 开发),变量默认情况下是不可变的。如果要使变量可变,则必须使用关键字mut 显式地进行声明,与 C++ 的做法正好相反——在 C++ 中,您必须使用关键字const 显式地将事物声明为不可变,否则它们默认情况下是可变的。

特别是随着多核处理器的出现和比以往更多的多线程软件,这对我来说更有意义。我认为默认情况下应该有更多的限制,并且限制应该在有意识和明确的情况下解除(而不是隐含)。例如,类的成员默认情况下是私有的;继承默认情况下也是私有的。您可以显式地将它们设置为publicprotected。因此,处理变量的修改权也应是如此。我认为默认情况下不应该有修改变量的权利。需要一些成熟度才能欣赏不变性/限制——通过设置限制,您可以避免软件中的一整类错误。这就是我的思考,以支持这种说法。

现在回到实际问题,

如果根据const人员的说法,类型应该默认为const,那么为什么 C++ 类型默认情况下不是const?

原因是:

  • 许多程序员并没有意识到将不可变性(作为默认值)设为易用,因为它是一种新趋势,至少最近才开始流行。
  • 向后兼容性。C默认具有可变类型。

这个回答如何解决问题? - user395760
@delnan: 现在这样吗? - Nawaz
我看不出包括前半部分的任何理由,但是是的,第二部分是一个答案(它是否是一个好答案是另一回事,我还不确定)。 - user395760
@delnan:第一部分支持这个说法(因为我没有看到很多人谈论默认不可变性),因为我必须先同意这个说法。第二部分取决于我对第一部分的看法。 - Nawaz

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接