C++ C++;枚举是默认可构造的吗?

C++ C++;枚举是默认可构造的吗?,c++,language-lawyer,c++17,C++,Language Lawyer,C++17,C++枚举类型似乎是“默认可构造的”: 如何从标准中解释这一点 我的意思是,我们想改变标准,使其不可默认构造。哪些条款会改变?都在: 默认初始化T类型的对象意味着: 如果T是(可能是cv限定的)类类型,则会考虑构造函数。列举了适用的构造函数 ([over.match.ctor]),并为初始值设定项()选择最佳值 通过过载解析。这样选择的构造函数被称为, 如果参数列表为空,则初始化对象 如果T是数组类型,则每个元素都默认初始化 否则,不执行初始化 UE和SE匹配第三个项目符号,就像基本类型一样

C++枚举类型似乎是“默认可构造的”:

如何从标准中解释这一点

我的意思是,我们想改变标准,使其不可默认构造。哪些条款会改变?

都在:

默认初始化T类型的对象意味着:

  • 如果T是(可能是cv限定的)类类型,则会考虑构造函数。列举了适用的构造函数 ([over.match.ctor]),并为初始值设定项()选择最佳值 通过过载解析。这样选择的构造函数被称为, 如果参数列表为空,则初始化对象

  • 如果T是数组类型,则每个元素都默认初始化

  • 否则,不执行初始化

UE
SE
匹配第三个项目符号,就像基本类型一样。因此初始化是一个简单的no-op,它们留下一个不确定的值


这也是您需要首先处理的项目符号列表,以使枚举不可默认初始化。

这里有一个规范草案:

见第9.6节,枚举声明

我认为您可能来自Java,在Java中枚举是类。在C++中,枚举值只是整数常量。常量的类型通常是
int
,尽管它可以明确定义


由于枚举只是一个
int
,当您在没有初始值设定项的情况下声明一个枚举时,不涉及默认构造函数;您只需要得到一个未初始化的
int

不要让
enum类中的
迷惑您:它仍然被视为非类类型。作用域枚举的语法恰好添加了
class
关键字,这样就不会在语言中添加另一个保留字。

它们就像
int
float
。如果定义这种类型的非静态局部变量,它将被取消初始化,其值将是不确定的。@Someprogrammerdude:是的,我知道。标准参考是什么?你能在枚举上声明重载运算符吗?@curiousguy:你可以重载任何不需要成员函数的运算符。例如,您可以使用非成员运算符重载来重载
+=
,但是您不能重载
->
“因为枚举只是一个int”如何重载它?不能在
int
上过载。
enum UE { a=1, b, c };
enum class SE { a=1, b, c };

int main() {
    UE ue;
    SE se;
}