我可以阻止std :: memcpy复制对象吗?

Nyk*_*kin 8 c++ memory c++11

使用私有拷贝construcor和赋值运算符boost::noncopyable或C++ 11 delete关键字很容易创建不可复制的类:

class MyClass {
private:
    int i;
public:
    MyClass(const MyClass& src) = delete;
    MyClass& operator=(const MyClass& rhs) = delete;    
    int getI() {
        return i;
    }
    MyClass(int _i) : i(_i){}
};

int main() {
    MyClass a(1), b(2);
    a = b; // COMPILATION ERROR
}
Run Code Online (Sandbox Code Playgroud)

但是,这并不能防止obiect被深度复制为一个字节包:

int main() {
    MyClass a(1), b(2);   
    std::memcpy(&a, &b, sizeof(MyClass));
    std::cout << a.getI() << std::endl; // 2
}
Run Code Online (Sandbox Code Playgroud)

即使试图通过声明operator&私有来阻止它,仍然可以使用地址的成语来实现复制:

int main() {
    MyClass a(1), b(2);   
    std::memcpy(std::addressof(a), std::addressof(b), sizeof(MyClass));
    std::cout << a.getI() << std::endl; // 2
}
Run Code Online (Sandbox Code Playgroud)

有没有任何方法可以完全防止每个字节复制一个实例?

R S*_*ahu 10

我可以阻止对象被复制std::memcpy吗?

简单回答是不".