为什么在模板元编程中使用枚举被认为是更好的做法而不是使用静态常量布尔值?我在Alexandrescu的书籍中读到过,但找不到相关内容,希望能够了解其中的原因。
C++标准(ISO/IEC 14882:2003)允许仅在需要“整数常量表达式”时使用静态const bool。
在标准化之前的C ++中,所有静态数据成员(包括const成员)都需要在其类外部定义。然而,在C ++标准化过程中,决定取消对静态const整数成员的此要求。目的是允许以下用法:
struct C
{
static const int N = 10;
};
char data[C::N]; // N "used" without out-of-class definition
如果没有N的命名空间范围定义,则无法使用N成员。
尽管如此,1998年C++标准的措辞仍要求在程序中使用成员时进行定义。这包括成员出现在任何位置,除了作为sizeof或typeid的操作数,实际上使上述代码不合法。
这被认为是一个缺陷,并调整了措辞,允许这样的成员出现在需要常量表达式的任何地方,而无需在类外部进行定义。这包括数组界限、case表达式、静态成员初始化器和非类型模板参数。
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
}
然而,这个陷阱并不适用于枚举。
static const
基元的内联初始化有关。 static bool const
是目前绝大多数人使用的方法。 static
数据成员是 const
整数或 const
枚举类型,则其在类定义中的声明可以指定一个常量初始化程序,该程序必须是一个整数常量表达式(5.19)。在这种情况下,该成员可以出现在整数常量表达式中。如果在程序中使用该成员,则仍应在命名空间范围内定义该成员,并且命名空间范围定义不得包含初始化程序。