在未来的 C++ 标准中,我们将拥有“琐碎可重定位性”的概念,这意味着我们可以简单地将字节从一个对象复制到未初始化的内存块,并简单地忽略/清零原始对象的字节。这样,我们就模仿了 C 风格的复制/移动对象的方式。
在未来的标准中,我们可能会有类似std::is_trivially_relocatable<type>类型特征的东西。目前,我们拥有的最接近的东西std::is_pod<type>将在 C++20 中弃用。
我的问题是,我们在当前标准(C++17)中是否有办法确定对象是否可以轻松重定位?例如,std::unique_ptr<type>可以通过将其字节复制到新的内存地址并将原始字节清零来移动,std::is_pod_v<std::unique_ptr<int>>但是false.
此外,当前的标准要求每个未初始化的内存块都必须通过构造函数才能被视为有效的 C++ 对象。即使我们能以某种方式弄清楚该对象是否可以轻松重定位,如果我们只是移动字节 - 根据标准它仍然是 UB。那么另一个问题是——即使我们可以检测到trivial relocatability,我们怎样才能在不引起UB的情况下实现trivial relocation呢?简单地调用memcpy + memset(src,0,...)并将内存地址转换为正确的类型就是 UB。`
谢谢!