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

标签 c++ c++11 scope destructor

我有 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 的 child ,而 Fruit 被声明在条件之外,所以范围不应该一直持续到返回吗?

最佳答案

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

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

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 ,这使它成为一种反模式。

关于c++ - 对变量范围感到困惑 - 意外调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28192501/

相关文章:

javascript范围问题

c++ - CMake 64位和SFML 64位

c++ - Visual Studio 2010 C++ 中 win32form 上的控制台应用程序输出

c++ - 这个未知大小数组的列表初始化在 C++0x 中有效吗?

c++ - 理论上,find_end 是可并行化的吗?

c++ - clang++、boost::spirit 和 c++11

Python,如何更改父作用域中变量的值?

javascript - Javascript(NodeJS) 如何处理有关事件的范围和上下文

c++ - 是否可以创建一个指向对象的智能指针并将该智能指针作为参数传递给构造函数?

c++ - 使用 lambda 的线程构建 block (TBB) 排队任务