c++ - 从 'const X*' 到 'X*' 的错误无效转换

标签 c++ pointers constants virtual

我有这段代码:

class C
{
    virtual vec3 f1(const A* a, B* b){...}
    virtual vec3 f2(A const* a, B const* b)
    {
        vec3 color = f1(a, b);
        ...
    }
}

我想调用f1来自 f2 ,但我不知道如何以正确的方式传递 b 。 现在编译,我得到:

error: invalid conversion from 'const B*' to 'B* [-fpermissive]'

我试过了 vec3 color = f1(a, const_cast<B *>(b));

这会编译,但随后我在执行时遇到段错误。

请注意,我无法更改任何函数签名。 我也不能改变 A 的定义或 B实现 getCopy()例如函数。

更新:

我找到了一个返回 b 的修改拷贝的函数,所以我的问题就解决了。 感谢大家说服我停止尝试将其直接转换为 f1。

最佳答案

如果不能更改函数签名,就无法解决问题。从逻辑上讲,f2 正在与调用者签订契约(Contract):“我将使用 B* 并使用它,但我保证不会修改它指向的 B”。如果您随后将该指针传递给 确实 修改 B 的其他内容,您就违反了约定。如果 f2 旨在修改 B,则它所采用的 B* 不应该是 const(也许它应该是 B&,作为旁注)。

至于崩溃:修改最初声明为 const 的对象是未定义的行为。实际上,这意味着编译器可以自由地做一些事情,比如将它存储在只读内存中,以及其他棘手的事情。如果您然后尝试写入它,则所有赌注都将关闭。它可能会崩溃。它可以工作。任何事情都有可能发生。

关于c++ - 从 'const X*' 到 'X*' 的错误无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102947/

相关文章:

c++ - 第一个 rand() 在 srand(time(0)) 之后生成相同的值

c++ - ClCompile 和 Emscripten

c++ - 如何创建大小合适的 QWebView?

c++ - 反转指针中的数组

c - 从不兼容的指针类型传递参数 1( `copyInfo`)

c++ - 在 Win 7 中从远程进程获取 PEB

c - 带 void 的动态数组内存分配**

c++ - 声明普通类和类模板的静态数据成员

c++ - 返回 'const' 或非常量引用之间的区别

c++ - 用常量初始化数组不起作用