对《Effective C++》条款2中取enum地址规则的困惑
《Effective C++》条款2枚举地址问题解惑
你搞混了枚举常量和枚举类型变量的区别,条款2里说的“取enum的地址不合法”,指的是枚举里的常量(比如你代码里的mon、tue),不是你定义的枚举变量day。
你的代码里,day是一个实实在在的枚举类型变量,它在内存里有自己的存储空间,和普通int变量没差,所以取它的地址&day完全合法,编译器当然不会报错。
但如果试试取枚举常量的地址,比如写&mon,这才会触发条款里说的错误——因为枚举常量是编译期就确定的常量,它不像变量那样占用内存,根本没有地址可言,就像#define定义的宏一样,宏是预编译阶段直接替换成数值,也没有内存地址,所以取#define的地址也不合法。
给你看个会报错的例子:
#include<iostream> using namespace std; int main() { enum week { mon=1, tue }day; // 尝试取枚举常量mon的地址,这才是条款说的不合法情况 int* p = &mon; return 0; }
这段代码编译时会直接报错,因为mon是编译期常量,不存在内存地址。
简单总结:
- 枚举变量:占内存,能取地址,合法。
- 枚举常量:无内存地址,取地址不合法,这才是条款2的描述对象。
内容的提问来源于stack exchange,提问作者ingridli
相关产品推荐
相关产品推荐

