You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非平凡可拷贝类的按位交换行为是否符合C++标准?

关于非平凡可拷贝类按位交换的行为确认

此前在MyString实现按位交换的问题上收到矛盾答案,因此简化问题如下:

  • 创建仅包含平凡可拷贝成员的SimpleClass;
  • 声明拷贝构造函数,使SimpleClass成为非平凡可拷贝类型;
  • 创建两个SimpleClass对象s1和s2;
  • 假设二者内存布局完全一致(即使存在填充),尝试通过按位方式交换它们。

已知SimpleClass并非平凡可拷贝类型,但我认为下述代码具有定义良好的行为,能否引用C++标准证实或反驳该观点?

示例代码

#include <cstring>
#include <type_traits>
#include <iostream>

struct SimpleClass {
    int m; 
    SimpleClass() : m(rand()){} 
    SimpleClass(const SimpleClass& o) : m(o.m) {} 
};

int main() {
    static_assert(!std::is_trivially_copyable_v<SimpleClass>);
    SimpleClass s1; 
    SimpleClass s2; 

    constexpr size_t SimpleClass_SIZE = sizeof(SimpleClass);
    alignas (SimpleClass) char tmp[SimpleClass_SIZE]; // alignas可能非必需
    std::memcpy(&tmp, &s1, SimpleClass_SIZE);
    std::memcpy(reinterpret_cast<void *>(&s1), &s2, SimpleClass_SIZE);
    std::memcpy(reinterpret_cast<void *>(&s2), &tmp, SimpleClass_SIZE);
}

讨论限定

仅针对满足以下条件的类的行为:

  • 仅包含平凡可拷贝成员;
  • 无虚成员函数/虚指针(此类情况使用按位拷贝会导致未定义行为)。

内容的提问来源于stack exchange,提问作者dwto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:28:13