在C ++中调用带括号的枚举/枚举类时会发生什么?

时间:2017-12-07 16:57:44

标签: c++ c++11 enums enum-class

这可能是一个有点奇怪的问题,但我真的不知道如何用它来表达它。

我刚刚发现我可以做到以下几点:

#include <iostream>

enum class Colour  // also works with plain old enum
{
    Red = 1,
    Green,
    Blue,
    Yellow,
    Black,
    White
};

int main()
{
    Colour c = Colour(15);  // this is the line I don't quite understand

    std::cout << static_cast<int>(c) << std::endl;  // this returns 15

    return 0;
}

所以现在我在Colour类型的变量中有整数值15。

这到底发生了什么?这是某种“构造函数”在起作用吗?据我所知,整数值15没有放入枚举,它只存储在变量c中。为什么这样的东西首先会有用 - 创建枚举中不存在的值?

2 个答案:

答案 0 :(得分:3)

Colour(15)是一个表达式,用于创建Colour枚举的临时(prvalue)实例,并使用值15初始化。

Colour c = Colour(15);从先前解释的表达式初始化类型为c的新变量Colour。它相当于Colour c(15)

答案 1 :(得分:2)

这里发生的事情是,如果您明确地转换或默认初始化它们,C ++ 11中的强类型枚举仍然能够保持超出范围的值。在您的示例中,Colour c = Colour(15);完全有效,即使Colour只有1-6的有意义值。