作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类似可选的类型(不能使用可选,因为它是 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/
我是一名优秀的程序员,十分优秀!