1

当我enum class在函数内部定义一个函数时,它具有来自可用选项的值。但是,当我在一个类中定义它时,它没有任何选项的值。那么初始值是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;
}
4

2 回答 2

1

始终初始化您的变量,C++ 不会多次使用“默认”值初始化它们。

在您在这里编写的这两种情况下,您都受编译器和操作系统的摆布,但很可能最终会出现garbage在您的enum变量中(这就是您在后一种情况下进行的实验)。如果你想看看那是什么garbage,执行这个:

std::cout << (int)g.f << std::endl;
于 2017-07-22T07:02:56.393 回答
1

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

结果是任何依赖于访问该值的操作都会给出未定义的行为。访问变量的值是必要的;

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

因此,要求未初始化的变量具有特定值是没有意义的。访问该值会产生未定义的行为,因此测试它是否等于(或不等于,或大于或......)任何值都会产生未定义的行为。

这通常通过将未初始化变量的值描述为indeterminate来概括。如果在不引入未定义行为的情况下无法访问值,则无法可靠地确定该值是什么。

当然,还有一个问题,为什么标准认为访问未初始化变量的值会产生未定义的行为。保留未初始化的值允许编译器为变量分配内存(例如,从堆栈中)但不打扰初始化它 - 该内存中的数据可以是任何发生在那里的数据。将变量初始化为任何指定值可能是一项昂贵的操作(例如,包含两百万个元素的数组是一个变量,尽管它很大,并且初始化它可能在计算上很昂贵)。这通常也是不必要的操作,因为许多代码对初始化变量所做的第一件事是(等待它......)为其赋值,即对其进行初始化。

(可能)不必要且计算上浪费的操作往往不受程序员和编译器供应商的欢迎。使行为未定义消除了所有这些......尽管要求程序员在访问其值的任何操作之前小心初始化其变量。

于 2017-07-22T07:13:42.690 回答