Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在枚举定义中,将以前定义的成员用作以后成员的一部分是否合法? 名称空间值类型{ 枚举枚举{ 布尔值=0, 浮动=1, 双重的 SInt=8, 长途跋涉, Unt= Snt+(1<p>是),要求是一个积分常量表达式。C++标准包括以下例子: namespace ValueType { enum Enum { Boolean = 0, Float = 1, Double, SInt = 8, SLong, UInt = SInt + (1 <<4), ULong = SLong + (1 << 4) }; } enum { d, e, f=e+2 };_C++_Enums_Portability - Fatal编程技术网

在枚举定义中,将以前定义的成员用作以后成员的一部分是否合法? 名称空间值类型{ 枚举枚举{ 布尔值=0, 浮动=1, 双重的 SInt=8, 长途跋涉, Unt= Snt+(1<p>是),要求是一个积分常量表达式。C++标准包括以下例子: namespace ValueType { enum Enum { Boolean = 0, Float = 1, Double, SInt = 8, SLong, UInt = SInt + (1 <<4), ULong = SLong + (1 << 4) }; } enum { d, e, f=e+2 };

在枚举定义中,将以前定义的成员用作以后成员的一部分是否合法? 名称空间值类型{ 枚举枚举{ 布尔值=0, 浮动=1, 双重的 SInt=8, 长途跋涉, Unt= Snt+(1<p>是),要求是一个积分常量表达式。C++标准包括以下例子: namespace ValueType { enum Enum { Boolean = 0, Float = 1, Double, SInt = 8, SLong, UInt = SInt + (1 <<4), ULong = SLong + (1 << 4) }; } enum { d, e, f=e+2 };,c++,enums,portability,C++,Enums,Portability,正如他所指出的,这是合法的 在一些罕见的情况下,我们应该意识到,只有在完全定义了枚举之后才指定枚举数的类型。该标准对枚举数的类型(7.2/4)作了如下说明: 每个枚举定义的类型不同于所有其他类型。在枚举说明符的右大括号之后,每个枚举数都有其枚举的类型。在右大括号之前,每个枚举数的类型是其初始化值的类型。如果为枚举数指定了初始值设定项,则初始化值具有与表达式的类型相同。如果没有为第一个枚举数指定初始值设定项,则该类型为未指定的整数类型。否则,该类型与前一个枚举数的初始化值的类型相同,除非递增值在该

正如他所指出的,这是合法的

在一些罕见的情况下,我们应该意识到,只有在完全定义了枚举之后才指定枚举数的类型。该标准对枚举数的类型(7.2/4)作了如下说明:

每个枚举定义的类型不同于所有其他类型。在枚举说明符的右大括号之后,每个枚举数都有其枚举的类型。在右大括号之前,每个枚举数的类型是其初始化值的类型。如果为枚举数指定了初始值设定项,则初始化值具有与表达式的类型相同。如果没有为第一个枚举数指定初始值设定项,则该类型为未指定的整数类型。否则,该类型与前一个枚举数的初始化值的类型相同,除非递增值在该类型中不可表示,在这种情况下,该类型为未指定类型足以包含递增值的整数类型

突出显示的句子可以在以下示例中显示:

namespace ValueType {
  enum Enum {
    Boolean = 0,
    Float = 1,
    Double,
    SInt = 8,
    SLong,
    UInt = SInt + (1 <<4),
    ULong = SLong + (1 << 4)
  };
}
enum { d, e, f=e+2 };

基本上,为
E0
选择的类型会影响
E1

的结果值,我甚至不知道这是合法的…neatIt不是真正的自引用。您有一些成员引用以前定义的成员。这里的规则是正常的-一旦定义,它就可见。我更新了问题以反映您的point.Thank.:)重要的一点是,枚举数的可见性在结束
之前开始这对C++用户很有用,但对于C++编译器的建设者来说更为复杂。当我看到你的答案和帕维尔的上述内容时,我立刻想起了Boost和meta编程,我怎么不记得?HEH。谢谢。):甚至可以使用布尔值:EnUM {Yes=true,NO=!!是!}。是的,根据C++的规则,积分类型包括“布尔、char、W查尔格、符号和无符号整数类型”和“布尔值作为整体类型。”可以理解且合乎逻辑,但我不明白为什么有人会避免给出初始值。这样做毫无意义地让您受编译器实现的支配。举个例子,在MSVC 2008中,您的E生成:E0(0)、E1(-1)、E2(0).就像所有这些行为一样,人们有时只是假设编译器会做明智的事情。当然,明智是他们期望发生的事情。