【问题标题】:What are global strongly-typed enums initialized to by default in C++?C++ 中默认初始化的全局强类型枚举是什么?
【发布时间】:2014-10-21 02:27:37
【问题描述】:

我正在尝试确定初始化全局强类型枚举的默认值。下面的代码当然不会编译。

#include <iostream>
using namespace std;

enum class A{a=10, b=20};

// Global strongly-typed enum, uninitialized
A k;

int main() {
    if(k==A::a)
        cout<<"Equal to a"<<endl;
    else if(k==A::b)
        cout<<"Equal to b"<<endl;
    else if(k==0)
        cout<<"Equal to zero"<<endl;

    return 0;
}

“k”初始化为什么?

【问题讨论】:

  • @JohnnyMopp 不,这不是重复的。您链接到的那个是询问函数范围的无范围枚举。这是关于命名空间范围范围的枚举。 非常不同的东西。
  • 它是重复的。您可以在上面链接的重复项的答案中找到您问题的答案
  • @glezmen 我仍然不这么认为——其他问题不包括范围枚举。是的,答案是一样的,但这并不意味着它是一个重复的问题。
  • @Angew "如果你在命名空间范围内定义了你的变量,它的值将被初始化为 0。" stackoverflow.com/questions/6842799/…
  • @glezmen 一个“作用域枚举”是enum class,而“非作用域枚举”就是enum。链接的问题根本不处理范围枚举(enum class 类型)。

标签: c++ enums initialization


【解决方案1】:

k 具有静态存储持续时间并且静态对象初始化为零,我们可以通过转到 draft C++ standard 部分看到这一点 3.6.2 非局部变量的初始化 段落 2

具有静态存储持续时间 (3.7.1) 或线程存储的变量 持续时间(3.7.2)应在任何其他之前被零初始化(8.5) 初始化发生。 [...]

对于标量类型,这意味着初始化为零,这在 8.5 段落 6 中介绍:

对 T 类型的对象或引用进行零初始化意味着:

并包括以下项目符号:

如果 T 是标量类型(3.9),则将对象初始化为值 通过将整数文字 0(零)转换为 T;105

获得

我们知道枚举是 3.9 Types 段落 9 中的标量类型,它说:

算术类型(3.9.1)、枚举类型、指针类型、指向的指针 成员类型 (3.9.2)、std::nullptr_t 和 cv 限定版本 这些类型(3.9.3)统称为标量类型。[...]

zero 是一个有效值,因为基础类型可以包含它的值,而 7.2 部分 枚举声明 段落 8 说枚举可以采用不由其枚举器定义:

[...]可以定义一个枚举,它的值不是 由它的任何枚举器定义。[...]

【讨论】:

    【解决方案2】:

    它是零初始化的。考虑到此枚举的底层类型是int(默认情况下),0 是一个有效的枚举数,尽管它没有在枚举的任何枚举数定义中显式使用..

    只有你必须写

    else if( k == static_cast<A>( 0 ) )
        cout<<"Equal to zero"<<endl;
    

    如果您使用 C#,则零可以隐式转换为任何类型的枚举。:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2011-04-18
      • 2014-08-02
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多