gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:49:25 24 4
gpt4 key购买 nike

我有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com