经营范围->

时间:2019-07-07 08:41:31

标签: c++ scope operator-overloading

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

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

然后将取消引用此结果导致未定义的行为(如Can a local variable's memory be accessed outside its scope?):

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

如果可以,仍然可以使用operator->来解决吗?

1 个答案:

答案 0 :(得分:1)

  

然后取消引用此结果会导致未定义的行为?

是的

  

如果可以,仍然可以使用operator->来解决吗?

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

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

如果Something占用了更多资源(内存,句柄等),则您可能想在operator->调用时构造它。您可以为此选择std::unique_ptr(动态)或std::optional(静态)。或者,如果Something支持未初始化状态(例如,默认构造),则可以稍后对其进行初始化(例如,移动分配)。


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

但是,我必须说,此问题的情况开始变得怪异,并且使操作符重载的方式更加严重。