没有初始化器的静态const

时间:2016-06-06 11:11:35

标签: c++ const static-initialization

在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限定类型TT应为具有a的类类型   用户提供的默认构造函数。

所以我问为什么C ++需要初始值设定项?如果a不是const,则不需要初始化程序,那么const在这里会产生什么区别会导致初始化程序不正确?

2 个答案:

答案 0 :(得分:0)

在类类型对象的一般情况下,零初始化可能不会产生有效对象。如果这样的类没有默认构造函数,那么没有初始化程序的那个类型的static const会产生无效的对象。

当前规则只是没有为零初始化足够好的类型添加异常。

支持零常数的额外语言功能会使事情复杂化而无法获得实际收益。

答案 1 :(得分:-1)

C不是一种非常安全的语言。在C中,const对象不需要初始值设定项。意思是你可以这样做:

int main()
{
    const int a;
}

糟糕。 a具有自动存储持续时间,因此它具有不确定的值。你以后不能改变它......

现在让我们说你允许这个功能。它会有意义吗?与C不同,C ++有一个名为常量初始化的概念,有时会执行而不是零初始化。但是你期望a的价值是什么?不确定的价值?它不能为零,因为我们只是说没有发生!

如果您希望a为零,那么只需 这样说 。不要依赖语言的隐式规则(在C&#39的情况下)是不一致的。这对可读性和可维护性都有害。