当函数接受对象的引用(并访问非const方法)时,如何抛弃const'ness?

Joh*_*ohn 3 c++ casting const

我有一个备份的数据副本,我想保护,所以我做了const.我需要const在两个场合违反这个问题,一次将原始数据存储到它:

fgBlocks.CopyInto((BlkArray&)backUpCopy);
Run Code Online (Sandbox Code Playgroud)

WRT

result CopyInto(BlkArray &replica) const {/**/}
Run Code Online (Sandbox Code Playgroud)

当我调用RemoveAll()它时,这是一个非const方法:

((BlkArray)backUpCopy).RemoveAll(true);
Run Code Online (Sandbox Code Playgroud)

第一个演员(如上所示(BlkArray&))是否正确?这是间接的一个方面,我现在还没有.然后,我将再添加一个未使用的方面,即抛弃const用于调用对象方法的方法,编译器不接受如上所示的方法.

成员声明如下:

BlkArray fgBlocks;
const BlkArray backUpCopy;
Run Code Online (Sandbox Code Playgroud)

我正在尝试扩展Correa的解决方案,所以:

    BlkArray *pBUCopy = (BlkArray *)&backUpCopy;
    fgBlocks.CopyInto(*pBUCopy);
Run Code Online (Sandbox Code Playgroud)

现在唯一的问题是编译器由于失败而失败

未初始化的成员'MyClass :: backUpCopy'与'const'类型'const BlockArray'

Set*_*gie 7

请注意,如果你这样做并且对象确实存在const,那么在抛弃constness 之后修改它是未定义的行为.

fgBlocks.CopyInto(const_cast<BlkArray&>(backUpCopy));
Run Code Online (Sandbox Code Playgroud)

另一个是同样的事情:

const_cast<BlkArray&>(backUpCopy).RemoveAll(true);
Run Code Online (Sandbox Code Playgroud)

  • @John所以你,实施者,正试图保护自己免受实施? (4认同)
  • @John:接口(声明)应该*不*告诉你有关实现细节(定义)的信息. (2认同)