std::destroy 是基本类型的空操作吗?
Is std::destroy a no-op for fundamental types?
我经常写这样的东西来防止std::destroy
循环遍历不需要销毁的元素数组,但我不知道它是否真的有用。
if constexpr (!std::is_fundamental_v<element_type>) {
std::destroy(container_begin(), container_end());
}
删除 if constexpr
语句会改变这段代码的行为吗?
Will dropping if constexpr statement change anything in the behavior of this code?
它不会以任何方式改变可观察的行为,假设容器的迭代没有副作用。
std::destroy
的行为是为每个元素调用 location->~T()
。 location->~T()
对普通类型(包括基本类型)没有影响。
优化器能否判断出循环遍历容器没有副作用取决于优化器的能力。如果容器是一个数组,这可能很容易证明。
我经常写这样的东西来防止std::destroy
循环遍历不需要销毁的元素数组,但我不知道它是否真的有用。
if constexpr (!std::is_fundamental_v<element_type>) {
std::destroy(container_begin(), container_end());
}
删除 if constexpr
语句会改变这段代码的行为吗?
Will dropping if constexpr statement change anything in the behavior of this code?
它不会以任何方式改变可观察的行为,假设容器的迭代没有副作用。
std::destroy
的行为是为每个元素调用 location->~T()
。 location->~T()
对普通类型(包括基本类型)没有影响。
优化器能否判断出循环遍历容器没有副作用取决于优化器的能力。如果容器是一个数组,这可能很容易证明。