【问题标题】:What is the difference between writing static const uint variable and anonymous enum variable?编写静态 const uint 变量和匿名枚举变量有什么区别?
【发布时间】:2015-11-11 14:24:33
【问题描述】:

正在查看boost asio ssl_client.cpp example 并在顶部找到了这个:

enum { max_length = 1024 };

不知道,这和这有什么区别

namespace {
    const int max_length = 1024;
}

static const int max_length = 1024;

或者也许它们绝对相等,但这只是更短?

【问题讨论】:

  • 我希望您的意思是通常可以互换,而不是“绝对相等”。我确信语言律师可以找到更多不同之处,但我会从&max_length 开始。我假设你从不使用&max_length。对于静态类,优化器是否可以假设您从不使用&max_length。如果不是,那是否会使类 static const int 的效率低于枚举?
  • 是的,JSF 命中了正确的点。
  • 请不要将其作为对该问题的欺骗而关闭。投票太误导人了。

标签: c++ boost enums


【解决方案1】:

它们是等价的,如果你将它用于价值,而不是通过引用。

enum { constantname = initializer }; 习惯用法过去在头文件中非常流行,因此您可以在类声明中毫无问题地使用它:

struct X {
    enum { id = 1 };
};

因为使用静态 const 成员,您需要一个类外初始化程序,并且它不能在头文件中。

更新

这些天很酷的孩子们这样做:

struct X {
    static constexpr int id = 1;
};

或者他们和 Scott Meyer¹ 一起写:

struct X {
    static const int id = 1;
};

// later, in a cpp-file near you:
const int X::id;

int main() {
    int const* v = &X::id; // can use address!
}

¹见Declaration-only integral static const and constexpr data members, Item #30

【讨论】:

  • 你说“曾经是”。愿意解释一下酷孩子们现在都在做什么吗?
  • @ams,我认为“酷孩子”使用 constexpr,我认为 SO 试图在 stackoverflow.com/questions/11522399/… 上解释其中的一些内容,但我希望得到更清晰的解释。
  • @ams 今天为这两种口味添加了“酷孩子的方式”! (现在有来源参考)
  • 谢谢。这解释了很多。
  • 所以本着最初的原因,“非酷孩子”使用enum,如果你真的真的想在定义类的标题中完全定义它(没有任何内容溢出到 .cpp 文件中)并且您希望 能够使用它的地址,我是否正确的是 static const int 仍然没有达到最初的目标,但是 @987654329 @能胜任吗?
【解决方案2】:

绝对值得一提的是,在一个类中,enum 值声明不会消耗存储空间,而 const[expr] int 的各种风格最终会占用 4/8/多少字节。

因此,如果有人需要一个结构来仅包含占用定义数量字节的 other 成员(例如,从另一个系统映射到字节结构的 POD),则将常量指定为 @987654323 @ 似乎是这样做的唯一方法。

也许很少见,但非常这样做的正当理由。

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 2011-01-14
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2016-10-19
    • 2011-07-30
    相关资源
    最近更新 更多