C++ 枚举类的超出范围值

C++ 枚举类的超出范围值,c++,c++11,enum-class,C++,C++11,Enum Class,当我在函数中定义enum类时,它有一个来自可用选项的值。但是,当我在类中定义它时,它的值没有任何选项。那么g.f的初始值是多少?比较时返回的true是什么((g.f==?)==true) #include <iostream> enum class Fruit { apple, orange }; class Garden { public: Fruit f; }; void print_enum(Fruit f) { switch(f)

当我在函数中定义
enum类时,它有一个来自可用选项的值。但是,当我在类中定义它时,它的值没有任何选项。那么
g.f
的初始值是多少?比较时返回的
true
是什么<代码>((g.f==?)==true)

#include <iostream>

enum class Fruit
{
    apple,
    orange
};

class Garden
{
public:
    Fruit f;
};

void print_enum(Fruit f)
{
    switch(f)
    {
        case Fruit::apple:
            std::cout<<"apple\n";
            break;
        case Fruit::orange:
            std::cout<<"orange\n";
            break;
        default:
            std::cout<<"other\n";
            break;
    }   
}

int main()
{
    Garden g;
    Fruit f;

    print_enum(f); // apple
    print_enum(g.f); // other

    return 0;
}
#包括
枚举类水果
{
苹果,
橙色
};
班级花园
{
公众:
果实f;
};
无效打印_枚举(f)
{
开关(f)
{
苹果:

STD::CUT

总是初始化变量,C++没有用“默认”值在几次内对它们进行初始化。

在这里编写的两种情况下,您都受编译器和操作系统的支配,但很可能会在
enum
变量中出现
garbage
(这就是您在后一种情况下所做的实验)。如果要查看
garbage
是什么,请执行以下操作:

std::cout << (int)g.f << std::endl;

std::cout该标准规定,访问自动存储持续时间的未初始化变量的值会产生未定义的行为

结果是,任何依赖于访问值的操作都会产生未定义的行为

  • 将其与另一个值进行比较。例如,如果
    a
    b
    未初始化,则
    a==b
    给出未定义的行为。如果
    a
    未初始化,则即使比较
    a==a
    也给出未定义的行为
  • 将该值分配给另一个变量。例如,
    a=b
    b
    未初始化时给出未定义的行为
  • 按值传递给函数。对于函数
    f()
    ,如果
    a
    未初始化,调用
    f(a)
    将给出未定义的行为

  • 输出值。例如,
    std::cout Undefined behavior。这里没有可靠的初始值,打印它也会导致其他问题。您必须指定一个值。@deviantfan,我知道这是一个未定义的行为。但为什么它既不是
    apple
    也不是
    orange
    ?因为它是UB?您认为UB有意义吗?未初始化的局部变量(如
    g
    f
    )有一个不确定的值。关于所有关于未定义行为的讨论,你可能想要。它是
    -1875479328
    就是这样,人们通常称之为
    垃圾
    ,但实际上它是在变量使用该空间之前使用该内存的任何内容的值。记住将变量初始化为
    0
    苹果
    或任何在每种情况下都有意义的东西。