在C中你可以这样做:
static const int a;
int main(){}
似乎很好。 C99§6.7.8p10说:
如果未初始化具有静态存储持续时间的对象 明确地说:
- 如果它有算术类型,则初始化为(正数或 无符号)零;
类似地,C ++14§3.6.2p2说:
具有静态存储持续时间(3.7.1)或线程存储的变量 持续时间(3.7.2)应在任何其他之前进行零初始化(8.5) 初始化发生。
不同之处在于C ++ 14它需要一个初始化器§8.5p7:
如果程序要求默认初始化a的对象 const限定类型
T
,T
应为具有a的类类型 用户提供的默认构造函数。
所以我问为什么C ++需要初始值设定项?如果a
不是const
,则不需要初始化程序,那么const
在这里会产生什么区别会导致初始化程序不正确?
答案 0 :(得分:0)
在类类型对象的一般情况下,零初始化可能不会产生有效对象。如果这样的类没有默认构造函数,那么没有初始化程序的那个类型的static const
会产生无效的对象。
当前规则只是没有为零初始化足够好的类型添加异常。
支持零常数的额外语言功能会使事情复杂化而无法获得实际收益。
答案 1 :(得分:-1)
C不是一种非常安全的语言。在C中,const
对象不需要初始值设定项。意思是你可以这样做:
int main()
{
const int a;
}
糟糕。 a
具有自动存储持续时间,因此它具有不确定的值。你以后不能改变它......
现在让我们说你允许这个功能。它会有意义吗?与C不同,C ++有一个名为常量初始化的概念,有时会执行而不是零初始化。但是你期望a
的价值是什么?不确定的价值?它不能为零,因为我们只是说没有发生!
如果您希望a
为零,那么只需 这样说 。不要依赖语言的隐式规则(在C&#39的情况下)是不一致的。这对可读性和可维护性都有害。