You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:35:18