能否在指向已分配存储空间的指针上调用显式对象成员函数?
能否在指向已分配存储空间的指针上调用显式对象成员函数?
嘿,这个问题得结合C++的对象生命周期和成员函数调用规则掰扯清楚,咱们先看一段测试代码,再慢慢拆解细节:
#include <memory> struct Ignore { constexpr Ignore(auto&& unknown_reference) {} }; struct X { constexpr bool f1() { return true; } static constexpr bool f2() { return true; } constexpr bool f3(this Ignore) { return true; } }; consteval bool test(int function) { std::allocator<
我给你理清楚不同成员函数的调用边界:
- 对于普通非静态成员函数
f1():哪怕函数体里没访问任何成员变量,你也不能用指向未构造对象的已分配存储空间的指针去调用它。因为C++标准明确要求,非静态成员函数的调用必须依托一个处于有效生命周期的对象实例——哪怕函数逻辑上不需要,对象的存在是调用的前提,否则就是未定义行为。 - 静态成员函数
f2():这个完全没毛病,静态成员函数不绑定任何具体的对象实例,哪怕你用空指针或者指向未构造空间的指针写p->f2(),编译器都会自动转成X::f2()的静态调用,不会有任何问题。 - 带显式对象参数的成员函数
f3(this Ignore):这种情况就特殊了,显式对象参数的设计本来就允许你传入任意符合参数类型的对象,和原类X的实例没有强制绑定。这里Ignore的构造函数能接受任意引用,所以哪怕你用指向未构造空间的指针生成引用,只要Ignore的构造是合法的,调用f3就没问题——因为此时函数依赖的是Ignore类型的对象,不是X的实例,根本不需要X的对象存在。
总结一下:普通非静态成员函数必须依托有效对象,静态和显式对象参数的成员函数(只要参数合法)则可以绕开这个限制。
内容来源于stack exchange
相关产品推荐
相关产品推荐

