在枚举定义中使用先前定义的成员作为后续成员的一部分是否合法?

发布于 2024-08-09 04:19:33 字数 204 浏览 3 评论 0原文

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

嘴硬脾气大 2024-08-16 04:19:33

是的——要求是它是一个整型常量表达式。 C++ 标准包括以下示例:

enum { d, e, f=e+2 };

Yes -- the requirement is that it's an integral constant expression. The C++ standard includes the following example:

enum { d, e, f=e+2 };
万水千山粽是情ミ 2024-08-16 04:19:33

正如 杰瑞,这是合法的。

在某些罕见的情况下,它会意识到枚举器的类型仅在枚举完全定义后才指定。该标准对枚举类型做了如下规定 (7.2/4):

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

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

enum E {
  E0            // Unspecified type
  , E1 = E0-1   // -1, or MAX_UINT
  , E2          // 0 or (MAX_UINT+1)
};

基本上,为 E0 选择的类型会影响 E1 的结果值。

As pointed out by Jerry, it is legal.

In some rare cases its wroth being aware that the type of the enumerators are only specified after the enumeration is fully defined. The standard says the following about the type of the enumerations (7.2/4):

Each enumeration defines a type that is different from all other types. Following the closing brace of an enum-specifier, each enumerator has the type of its enumeration. Prior to the closing brace, the type of each enumerator is the type of its initializing value. If an initializer is specified for an enumerator, the initializing value has the same type as the expression. If no initializer is specified for the first enumerator, the type is an unspecified integral type. Otherwise the type is the same as the type of the initializing value of the preceding enumerator unless the incremented value is not representable in that type, in which case the type is an unspecified integral type sufficient to contain the incremented value.

The highlighted sentence can be shown in the following example:

enum E {
  E0            // Unspecified type
  , E1 = E0-1   // -1, or MAX_UINT
  , E2          // 0 or (MAX_UINT+1)
};

Basically, the type chosen for E0 affects the resulting value of E1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文