簡體   English   中英

從“ const X *”到“ X *”的錯誤無效轉換

[英]error invalid conversion from 'const X*' to 'X*'

我有這段代碼:

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

我想從f2調用f1 ,但是我不知道如何以正確的方式傳遞b。 現在進行編譯,我得到:

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

我試過vec3 color = f1(a, const_cast<B *>(b));

這樣可以編譯,但是執行時出現分段錯誤。

請注意,我不能更改任何功能簽名。 我也不能更改AB的定義來實現例如getCopy()函數。

更新:

我發現了一個函數,該函數返回b的修改后的副本,因此解決了我的問題。 謝謝大家說服我停止嘗試將其直接轉換為f1。

如果您不能更改功能簽名,那么您將無法解決問題。 從邏輯上講, f2與調用方簽有合同:“我將使用B *並使用它,但我保證我不會修改它指向的B ”。 如果您隨后將該指針傳遞給其他確實會修改B您違反了合同。 如果f2用於修改B ,則它所使用的B*不應為const (並且可能應為B& ,作為旁注)。

至於崩潰:修改最初聲明為const的對象是未定義的行為。 實際上,這意味着編譯器可以自由地做一些事情,例如將其存儲在只讀存儲器中以及其他棘手的事情。 如果您隨后嘗試對其進行寫操作,則所有選擇都將關閉。 可能會崩潰。 它可以工作。 什么都可能發生。

唯一的邏輯解決方案是

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

運行時很容易崩潰,因為在const_cast之后修改以前的const聲明的變量是未定義的行為。 而且我猜b最初是const ,而f1試圖對其進行修改。

從編譯器的POV考慮一下:您需要兩個函數f1f2 您可以將常量參數傳遞給f2 ,從而確保您不會修改它們。 但是隨后您嘗試將它們傳遞給f1 ,后者可以對其進行修改。

如果f1修改了指針的目標,則f2 f1修改; 因此f2不能使用指向const對象的指針。 您必須從f2刪除const ,而不要嘗試使用常量對象來調用它。 不允許您修改const對象,並且如果嘗試這樣做,程序可能會崩潰(或者具有未定義的行為)。

如果f1沒有修改它,則將該指針更改為const 聽起來確實如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM