gpt4 book ai didi

c++ - 我需要在这里显式调用析构函数吗?

转载 作者:太空狗 更新时间:2023-10-29 20:51:08 28 4
gpt4 key购买 nike

我有一个类似可选的类型(不能使用可选,因为它是 C++17):

template <typename T>
struct maybe {
maybe() : valid_(false) {}
maybe(T value) : valid_(true) { new (&value_) T(value); }

// destructor
~maybe() {
if (valid_) {
value_.~T();
}
}

// move value out of maybe
operator T&&() && {
valid_ = false;
return std::move(value());
}

// explicit validity
explicit operator bool() const {
return valid_;
}

T& value() {
if (!valid_) {
throw std::runtime_error("boom");
}
return value_;
}

private:
union {
T value_;
};
bool valid_;
};

我很好奇 operator T&& 只是将值移出是否不合适,因为析构函数将不再这样做。似乎我需要将值移动到临时值,破坏我的存储,然后返回。哪种方式正确?

最佳答案

不需要,不需要手动调用析构函数。 Move 仅用于调用采用右值引用的重载。如果调用代码对函数结果不做任何事情,那么这就是 noop。即使调用代码确实弄乱了值,该值也应该保持在某个有效(但未指定)状态并且仍然需要正确销毁(这将在可能对象被销毁时发生)。

关于c++ - 我需要在这里显式调用析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51640171/

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