example 1:
1 template<size_t N> 2 struct Fac { 3 enum { 4 value = Fac<N - 1>::value +N, 5 }; 6 }; 7 8 template<> 9 struct Fac<0> { 10 enum { 11 value = 0, 12 }; 13 };
example 2:
1 template<size_t N> 2 struct Fac1 { 3 4 static constexpr size_t value = Fac1<N - 1>::value + N; 5 }; 6 7 template<> 8 struct Fac1<0> { 9 10 static constexpr size_t value = 0; 11 };
example 3:
1 template<size_t N> 2 struct SumUp { 3 enum {value = SumUp<N-1>::value + N}; 4 }; 5 6 template<> 7 struct SumUp<0> { 8 enum { value = 0 }; 9 }; 10 11 template<size_t N> 12 struct Fac { 13 enum { 14 value = Fac<N - 1>::value +N, 15 }; 16 };
The most significant difference (since C++17 avoids the need for an out-of-class definition for the static data member) is that enumerators are instantiated along with the containing class, whereas static data members are instantiated only when needed. (Note, however, that MSVC, at least, doesn’t always properly defer them.)
这其实是因为常量表达式最初只能用enum来声明,但后来(实际上是C++98)允许在类内部初始化static int常量: