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
相关产品推荐
相关产品推荐

