运算符>的范围

Scope of operator->

本文关键字:范围 gt 运算符      更新时间:2023-10-16

当重载运算符->时,最终必须返回一个指针。如果此指针指向在函数中创建的对象,例如:

struct Something {
char c;
Something(char k){
c = k;
}
};
struct Hello {
int a;
Something* operator->(){
Something s(a);
return &s;
}
};

然后取消引用这会导致未定义的行为(如可以在其范围之外访问局部变量的内存吗?

Hello h {5};
cout << h->c;

如果是这样,是否可以解决此问题,仍然使用operator->

那么取消引用会导致未定义的行为吗?

是的。

如果是这样,是否可以解决此问题,仍然使用operator->

以下内容适用于任何其他成员函数。

创建Something实例作为Hello的成员。然后指向它的指针在Hello的生命周期内仍然有效。您可以从立即存储的整数构造Something,以便摆脱它。

如果Something需要额外的资源(内存、句柄等),你可能希望在调用operator->时构造它。您可以选择std::unique_ptr(动态)或std::optional(静态)。或者,如果Something支持未初始化状态(例如默认构造),则可以稍后对其进行初始化(例如移动分配)。


如果您无法更改Hello类,那么您唯一的选择是重载operator->直接按值Something返回。

但是,我必须说,这个问题的情况开始变得奇怪,重载运算符的方式更是如此。