【问题标题】:Static const without initializer没有初始化器的静态 const
【发布时间】:2016-06-06 11:11:35
【问题描述】:

在 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:

如果一个程序调用一个对象的默认初始化 const 限定类型 T, T 应该是一个类类型 用户提供的默认构造函数。

所以我问为什么 C++ 中需要初始化程序?如果a 不是const,则不需要初始化程序,那么const 在这里有什么不同会使没有初始化程序不好?

【问题讨论】:

  • C 和 C++ 是不同的语言。

标签: c++ constants static-initialization


【解决方案1】:

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

当前规则只是不添加零初始化就足够好的类型的例外。

支持零常量的额外语言功能会使事情复杂化而没有真正的收获。

【讨论】:

    【解决方案2】:

    C 不是一种非常安全的语言。在 C 中,const 对象不需要初始化程序。这意味着您可以这样做:

    int main()
    {
        const int a;
    }
    

    哎呀。 a 具有自动存储期限,因此它具有不确定的值。而且以后无法更改...

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

    如果您希望 a 为零,那么只需这样说。不要依赖语言的隐含规则(在 C 的情况下)是不一致的。这不利于可读性和可维护性。

    【讨论】:

    • 问题是关于 文件范围 变量,而不是自动变量。文件范围int 变量被初始化为 0,所以所有关于不确定值的讨论都是无关紧要的。
    猜你喜欢
    • 2011-04-18
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2013-04-13
    • 2011-05-04
    相关资源
    最近更新 更多