gpt4 book ai didi

C++ 值省略和析构函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:55 26 4
gpt4 key购买 nike

我正在编写一个文件处理类,我希望它具有的功能之一是“游览”,您可以在其中临时查找文件的一部分,然后再查找。我希望这是自动完成的。我的想法是我的文件类中有如下代码:

struct File {
...
struct Excursion {
Excursion(File& file, off64_t new_off)
: pi_(make_shared<impl>(file, new_off)) {}

private:
struct impl {
impl(File& file, off64_t new_off)
: file(file), off(file.tell()) {
file.seek(new_off);
}

~impl() {
file.seek(off);
}

File &file;
off64_t off;
};

shared_ptr<impl> pi_;
};

Excursion excursion(off64_t off) {
return Excursion(*this, off);
}
};

然后我可以用这样的东西开始游览:

file.excursion(512); 

这将返回一个 Excursion 对象,该对象只包含对文件的引用和当前偏移量。当此对象超出范围时,它会自动恢复文件偏移量。这对于必须跳过文件来解析它的代码来说非常好。

我的问题是,如果我从 file.excursion() 返回那个 Excursion 对象并且不将它分配给任何东西,C++ 是否允许完全省略该值而不调用析构函数?

编辑:

根据下文,Zbynek Vyskovsky - kvr000 是正确的,没有省略析构函数。 但是,执行如上所示的偏移会返回一个对象,该对象会立即被破坏,因为它没有分配给任何东西。

阅读 here ,因为它是从该函数评估返回的临时值,所以该对象在评估创建它的表达式的最后一步被销毁。因此,它不会持续到封闭范围结束。因此,如果不将偏移对象分配给更高范围的变量,这种技术就无法工作。

这会起作用:

Excursion ex = file.excursion(512);

但是必须有一个虚拟变量是否正确,这是一个意见问题。

最佳答案

不,它不能忽略析构函数。

只有当编译器发现它没有任何效果时,才会进行优化并删除部分代码。这显然不是这里的情况,因为您从影响其他对象全局状态的析构函数调用另一个方法。

关于C++ 值省略和析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38377210/

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