【问题标题】:Scope of operator->运算符范围->
【发布时间】:2019-07-07 08:41:31
【问题描述】:

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

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-&gt;

【问题讨论】:

  • 你为什么要这样做?你可以添加静态关键字,它会工作,但我不明白你的软件设计。
  • @nivpeled 这比这个问题要复杂得多。
  • operator-&gt; 是一个完全正常的函数。名称和语法有些不寻常,但它们只是糖。
  • inline 与此无关。

标签: c++ scope operator-overloading


【解决方案1】:

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

是的。

如果是这样,是否可以解决,仍然使用operator-&gt;

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

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

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


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

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

【讨论】:

  • 您返回的是std::shared_ptr 还是只是原始指针? std::unique_ptr 有什么问题?
猜你喜欢
  • 2011-01-21
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多