memcpy 写入“class uint256”类型的对象

memcpy writing to an object of type ‘class uint256’

好吧,这可能是一个非常简单的修复警告,但我还没有弄明白。前段时间,我对我的 uint256 class 进行了更新,之后,我收到了这个警告:

base58.h:261:52: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘class uint256’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
         memcpy(&id, &vchData[0], HASH_LEN_BYTES);

这是 memcpy 所在的函数:

bool GetKeyID(CKeyID &keyID) const {
    if (!IsValid())
        return false;
    switch (nVersion) {
    case PUBKEY_ADDRESS:
    case PUBKEY_ADDRESS_TEST: {
        uint256 id;
        memcpy(&id, &vchData[0], HASH_LEN_BYTES);
        keyID = CKeyID(id);
        return true;
    }
    default: return false;
    }
}

这是我的 uint256 class: uint256.h

有两种替代解决方案:

  • 使 class 易于复制。
  • 不要尝试 memcpy class。

how i can replace memcpy on this context?

编写一个接受任何 vchData 作为参数的构造函数。

how i can make the class trivially copyable?

删除复制构造函数和任何不可简单复制的成员/基。

您已经为 base_uint<N> class here

定义了复制分配

以及 base_uint here, and a conversion constructor uint256 here

的复制构造函数

此外,如果您只是将 (uint256*) 参数转换为 (void*),警告将消失,您将获得预期的行为,但这不是推荐的方法,因为它可能会无声地中断将来如果你真的在作业中做出不同的东西。我认为最好的是删除那些复制构造函数和赋值运算符。在我看来,唯一有趣的运算符是 base_uint 不同宽度之间的转换。