对变量范围感到困惑 - 意外调用析构函数

Confused by variable scope - destructor called unexpectedly

我有 3 个 类,Fruit、Apple 和 Orange,Fruit 是两者的父级。我有一个静态方法,我执行以下操作:

int32_t Fruit::frutificate(const Settings& settings) {
  Fruit listener;
  if (settings.has_domain_socket()) {
    listener = Apple(settings);
  } else {
    listener = Orange(settings);
  }
  return uv_run(listener.loop, UV_RUN_DEFAULT);
}

令我困惑的是,Apple 的析构函数在条件内被调用,它运行 Fruit 没有的清理代码。 Apple 是 Fruit 的子项,并且 Fruit 被声明在条件之外,所以范围不应该持续到 return?

您正在创建 Apple 类型的临时文件。它在它所属的表达式的末尾超出范围 - 这是赋值语句。当它超出范围时,将调用析构函数。 FruitApple之间的层级关系在这里是无关紧要的。

如果有帮助,你可以想到这个块:

if (settings.has_domain_socket()) {
    listener = Apple(settings);
}

基本等同于:

if (settings.has_domain_socket()) {
    Apple some_temporary_apple(settings);
    listener = std::move(some_temporary_apple);
}

这可能会更清楚为什么 ~Apple() 在作业结束时被调用。

另请注意:

Fruit f = Apple();

将执行 object slicing,这使其成为反模式。