为什么enum而不是静态bool?

The*_* do 3 c++ metaprogramming

为什么在模板元编程中使用枚举而不是静态const bool被认为是更好的做法?
我在亚历山德列斯库的书中读到过这个但是找不到它,真的很想知道它.

sha*_*oth 7

关键原因是静态bool毕竟是一个变量而枚举是一个类型 - 因此在枚举的情况下,没有变量被实例化,因此它保证是编译时评估.

有关更多详细信息,请参阅此问题.


dec*_*ype 7

C++标准(ISO/IEC 14882:2003)仅允许BOOL其中一个静态常量的使用积分常量表达式需要.

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

struct C
{
  static const int N = 10;
};
char data[C::N]; // N "used" without out-of-class definition
Run Code Online (Sandbox Code Playgroud)

没有N的命名空间范围定义.

尽管如此,如果该成员在该计划中使用,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
Run Code Online (Sandbox Code Playgroud)

但是,除了需要使用整数常量表达式之外,在任何地方使用静态const积分成员都需要定义.但大多数编译器都不会诊断此违规行为:

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

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

然而,这个陷阱不适用于枚举.