[英]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));
這樣可以編譯,但是執行時出現分段錯誤。
請注意,我不能更改任何功能簽名。 我也不能更改A
或B
的定義來實現例如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考慮一下:您需要兩個函數f1
和f2
。 您可以將常量參數傳遞給f2
,從而確保您不會修改它們。 但是隨后您嘗試將它們傳遞給f1
,后者可以對其進行修改。
如果f1
修改了指針的目標,則f2
f1
修改; 因此f2
不能使用指向const
對象的指針。 您必須從f2
刪除const
,而不要嘗試使用常量對象來調用它。 不允許您修改const
對象,並且如果嘗試這樣做,程序可能會崩潰(或者具有未定義的行為)。
如果f1
沒有修改它,則將該指針更改為const
。 聽起來確實如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.