模板中的匿名枚举

4

很多模板化的代码看起来像这样:

template <typename T>
class foo
{
   enum { value = <some expr with T> };
};

可以在素数检查程序中这里看到一个示例,我曾经在阶乘实现中也看到过它。
我的问题是为什么使用无名枚举?有特别的原因吗?例如,静态const int 也可以工作吗?
编辑:
@Benoît:谢谢链接,它提供了我正在寻找的洞察力!
2个回答

8

一个静态常量变量将占用内存(就像Sean所说的那样),而枚举类型不占用任何内存。它们只存在于编译器的世界中,在运行时它们只是普通的整数。

除此之外,它可以正常工作,除非编译器实现标准有问题。

在boost邮件列表中有一篇详细的主题帖


@underscore_d,你能给我一个例子来说明枚举和常量在大小上的区别吗? - Asif Mushtaq
我曾说过const[expr]成员会增加sizeof(Obj),特别是指static的那些,但回想起来,我觉得我很蠢。我应该说'static const[expr]变量可能会在可执行映像和可能的RAM中分配空间,但不是每个实例-有一个非常明显的原因:它们是静态的。现在我要测试是否像enum一样,编译器会将微不足道的static const[expr]常量进行值内联。 - underscore_d
任何可能具有指针的常量都必须在内存中。例如,const int x; 由于某人可能执行 const int * y = &x; 或 const int& y = x; 或将该常量通过引用传递给函数 fun(const int& x_); fun(x); 等操作,因此需要在内存中。同时,枚举是无法通过指针或引用访问的常量,因此仅存在于编译时。 - rxantos

3

如果我没记错的话,静态常量需要通过声明和定义变量来分配空间,而未命名的枚举不需要。


Sean,你能举个例子来解释一下你的答案吗? - Asif Mushtaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接