非平凡可拷贝类的按位交换行为是否符合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
相关产品推荐
相关产品推荐

