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

C++结构体中函数指针/引用成员能否声明为const?

结构体中函数指针/引用成员能否声明为const?

这是个小众技术问题,目前相关的完整解答不多。我们知道结构体的普通数据成员(比如int)可以声明为const,但结构体中的函数指针成员或引用成员,能不能被声明为const成员呢?

通过研读C++17标准第9.3节的内容,结论如下:

  • 引用成员:绝对不可以
    C++标准中,引用本身不是对象,它只是对另一个对象的绑定,且绑定一旦建立就无法更改。语法上不允许用const修饰引用成员,比如const void (&rfn)(int);这种写法会直接触发编译错误——引用没有顶层const的概念,也就不存在“const引用成员”这种说法。

  • 函数指针成员:不能像普通数据成员那样直接声明为const,但可以声明为const指针
    如果尝试像普通成员那样在函数指针前加const(比如const void (*pfn)(int);),这实际上是声明了一个指向返回const void类型函数的指针,并不是让这个指针成员本身成为const。
    若要让函数指针成员本身不可被修改(即类似const成员的效果),需要把const放在指针符号的右侧:void (*const pfn)(int);。但这本质是声明了一个const的函数指针类型成员,而非传统意义上的“const成员”写法。不过从功能上看,这个指针成员在结构体对象初始化后就无法被重新赋值,和const成员的行为一致。

示例代码对比:

struct Ex {
  const int i;                  // 合法的const数据成员
  // const void (*pfn)(int);    // 不是const成员,是指向返回const void的函数的指针
  void (*const pfn)(int);       // 合法的const函数指针成员(指针本身不可修改)
  // const void (&rfn)(int);    // 非法,引用成员不能被const修饰
  void (&rfn)(int);             // 合法的引用成员,本身绑定后不可修改
};

内容的提问来源于stack exchange,提问作者JWCS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:07:42