C++ 为什么使用枚举而不是静态布尔?

C++ 为什么使用枚举而不是静态布尔?,c++,metaprogramming,C++,Metaprogramming,为什么在模板元编程中使用enum而不是static const bool被认为是更好的做法? 我在Alexandrescu的书中读到过,但找不到它,我真的很想知道它。关键原因是静态bool毕竟是一个变量,而enum是一种类型-因此在enum的情况下,没有任何变量被实例化,因此它保证是一个编译时计算 有关更多详细信息,请参见。这是一个旧的建议,它基于旧编译器在类定义内部的静态常量原语的内联初始化方面的缺陷静态布尔常数是目前最常用的方法 根据C++03标准§9.4.2/4: 如果静态数据成员属于常量

为什么在模板元编程中使用enum而不是static const bool被认为是更好的做法?

我在Alexandrescu的书中读到过,但找不到它,我真的很想知道它。

关键原因是静态bool毕竟是一个变量,而enum是一种类型-因此在enum的情况下,没有任何变量被实例化,因此它保证是一个编译时计算


有关更多详细信息,请参见。

这是一个旧的建议,它基于旧编译器在类定义内部的
静态常量
原语的内联初始化方面的缺陷<代码>静态布尔常数是目前最常用的方法

根据C++03标准§9.4.2/4:

如果
静态
数据成员属于
常量
整数或
常量
枚举类型,则其在类定义中的声明可以指定常量初始值设定项,该初始值设定项应为整数常量表达式(5.19)。在这种情况下,成员可以出现在积分常量表达式中。如果在程序中使用该成员,则该成员仍应在名称空间范围中定义,且名称空间范围定义不应包含初始值设定项

C++标准(ISO/IEC 1488∶2003)允许使用一个静态常数布尔值,只有一个积分常量表达式是<强>要求>

在标准C++中,所有静态数据成员(包括const成员)需要在类之外定义。但是,在C++标准化过程中,决定解除静态const积分成员的这个要求。其目的是允许以下用途:

struct C
{
  static const int N = 10;
};
char data[C::N]; // N "used" without out-of-class definition
没有N的命名空间范围定义

然而,如果C++成员在程序中使用,则1998 C++标准的措辞仍然需要定义。这包括除了作为sizeof或typeid的操作数之外的任何位置出现的成员,有效地使上述格式错误

这被认为是一个缺陷,并对措辞进行了调整,以允许此类成员出现在需要常量表达式的任何地方,而不需要类外定义。这包括数组边界、大小写表达式、静态成员初始值设定项和非类型模板参数

struct C
{
  static const int N = 10;
  static const int U = N; // Legal per C++03
};

char data[C::N]; // Legal per C++03

template<int> struct D;

template<> struct D<C::N> {}; // Legal per C++03
然而,这个陷阱不适用于枚举

struct C
{
  static const int N = 10;
};

int main()
{
  int i = C::N; // ill-formed, definition of C::N required
}