The*_* do 3 c++ metaprogramming
为什么在模板元编程中使用枚举而不是静态const bool被认为是更好的做法?
我在亚历山德列斯库的书中读到过这个但是找不到它,真的很想知道它.
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)
然而,这个陷阱不适用于枚举.