【问题标题】:Default value of enum declared in class类中声明的枚举的默认值
【发布时间】:2016-11-17 08:53:33
【问题描述】:

我有一个类,它的成员是在这个类中声明的枚举:

#include<iostream>

class test
{
public:
    enum TYPE{MAN, WOMAN};

    TYPE type;
};


int main()
{
    test x;
    if(x.type == test::MAN) std::cout<<"MAN"<<std::endl;
    if(x.type == test::WOMAN) std::cout<<"WOMAN"<<std::endl;
    std::cout<<"ok"<<std::endl;
    return 0;
}

know,如果枚举在命名空间范围内声明,它的默认值为 0,而当它在本地声明时,它没有任何默认值,这会导致未定义的行为。

我的问题是:如果我有一个属于某个类的枚举怎么办?它也是未定义的行为吗?

我测试了上面的代码,x.type 既不是 MAN 也不是 WOMAN。但是,我只为一个编译器和一个操作系统完成了它。我对更一般的答案感兴趣。我在其他任何地方都没有找到有关此问题的任何信息。

Edit1:引用这个不确定的值会导致分段错误吗?

Edit2:我知道这不是一个设计良好的类——它不是我的,我正在尝试调试它。所以告诉我我可以默认初始化对象并不能解决我的问题。请把它当作一个理论问题。

【问题讨论】:

  • 这与枚举完全无关。 struct X { int n; }; 会有完全相同的问题。
  • 你应该给你的type成员一个大括号或相等的初始化器,或者给你的test类一个默认构造函数,将type初始化为一个默认值
  • 这不是关于枚举,而是关于读取一个未初始化的变量。 UB。

标签: c++ enums undefined undefined-behavior


【解决方案1】:

enum 中名字的默认值为 0,与 enum 的范围无关。

这里的main 中没有像test x; 这样的自动局部变量的保证默认值。它有一个不确定的值。使用该值是未定义的行为。

您可以像这样 ¹默认初始化它:

test x{};

¹ 一个微妙的点是,在顶层,这给出了“值初始化”。

【讨论】:

  • OP 询问枚举变量的默认值是否未初始化。
  • 我认为OP指的是TYPE type对象的默认值
  • @Cheers 和 hth。 - 引用这个不确定的值会导致分段错误吗?
  • @user2738748:理论上是的,使用 UB 任何事情都可能发生。尤其是因为编译器可以将正式的 UB 视为 carte blanche 来进行各种意想不到的、令人惊讶的优化。但也因为架构可以具有整数值的陷阱表示,和/或使用额外的陷阱位来捕获未初始化(不确定)值的使用。
【解决方案2】:

如果您的对象没有任何构造函数,那么这取决于您创建对象的位置。如果它是全局创建的,那么所有变量都是零初始化的。如果不是,则它们没有正确初始化,并且从它们中读取会导致 UB。

您可以使用test x{}; 语法强制对非全局变量进行零初始化。

【讨论】:

    【解决方案3】:

    首先:“测试”未定义的行为几乎永远不会给你正确的答案。

    这是undefined behavior,因为您正在读取具有自动存储持续时间的未初始化变量。此类变量具有不确定值,不得从中读取。每个非静态函数作用域变量都有自动存储期限。

    我认为您将枚举类型的定义(发生在类定义中)与该类型变量的声明(在函数范围内)混淆了.在您的示例中,x 是一个具有自动存储持续时间的变量,无论在何处定义了 TYPE 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2016-10-10
      • 2020-03-03
      • 2015-08-22
      • 2022-01-23
      • 2023-03-27
      相关资源
      最近更新 更多