首先让我问一个普遍的问题:
然后是一个特定的:
const?换句话说,如果您尝试创建const它的非对象,则会遇到编译时错误的类.在许多情况下,这似乎是很自然的事情,但C++不允许这样做.这背后的原因是什么?(当然,我可以让所有的成员const,但这有点像一个copout.)您的第一段详细介绍了C++的灵活性,并允许您表达许多不同的程序.
你的第二段询问为什么C++不允许程序员强制执行一个具有可疑益处的严格限制(当你可以简单地标记所有成员const以获得几乎相同的结果时).
让我们每个人从这种二分法中得出自己的结论.:)
为什么 C++ 似乎不支持创建其对象只能是 const 的类?换句话说,如果您尝试创建类的非常量对象,则会出现编译时错误。在许多情况下,这似乎是很自然的事情,但 C++ 不允许这样做。这背后的原因是什么?
我想到的第一个问题是,拥有一个所有对象所属的类型const是一件很自然的事情。有些类型本质上是不可变的,在某些语言中甚至建议使尽可能多的类型成为不可变的,但这与强制所有对象都是不可变的不同const。
在类设计中,控制任何成员函数是否修改实现不可变对象的对象的状态是很简单的。然后,封装将发挥其魔力,如果您不公开任何变异函数,那么该类型是不可变的并且与const. 您还可以(如果您想要额外的安全性)限定所有成员数据,以便const让编译器告诉您是否在自己的代码中违反了自己的约束。请注意,强制所有对象隐式const会将所有成员数据标记为const,并且您的非常量函数无用。
既然可以通过不同的方式以很少的成本实现高水平的效果,为什么要在没有附加值的情况下让复杂的语言变得更加复杂呢?
虽然上面的问题看起来像是夸夸其谈,但事实并非如此。考虑语言扩展的标准之一是投资回报:如果没有这个功能,我们将能够做什么?(即,这是一个启用功能吗?)如果答案是否定的,那么下一个问题是,与当前状态相比,有了此功能,程序员的生活会变得简单多少?(对于非启用功能,添加它们的价值是什么?)
在启用类别中,示例是rvalue-references;如果没有该语言功能,您就无法实现完美转发,也无法实现移动语义。在第二类中,您可以考虑 lambda — 没有任何 lambda 能做的事,没有它们就做不到 — 其价值在于简化用户代码(必须是复杂的代码:创建一个函子,声明该函子的所有成员)正确的类型,提供一个构造函数来初始化(捕获成员)……)但是使用 lambda 后代码变得更加简单。请注意,Sutter 花了相当多的时间才让 Stroustrup 相信 lambda 是有价值的。
就您而言,您所要求的不是启用功能,并且在没有该功能的情况下支持用例的成本足够低,因此不允许将其作为核心语言功能提供。