簡體   English   中英

'std :: list <_Ty> :: push_back':無法將'this'指針從'const std :: list <_Ty>'轉換為'std :: list <_Ty>&'

[英]'std::list<_Ty>::push_back' : cannot convert 'this' pointer from 'const std::list<_Ty>' to 'std::list<_Ty> &'

我在嘗試編譯以下內容時收到此錯誤消息

void MyClass::MyFunc() const
{
      int i= 0;
      myList.push_back(i);
}

我已經不得不將const添加到函數中,盡管它返回void ,修復了函數本身調用的相同問題,但是現在它與STL的成員一起發生,我在想是非常的我的代碼錯了。 作為參考,錯誤是

cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'

事實上,我很少知道自從我從與編碼標准和最佳實踐有非常濫用關系的人那里繼承了這些內容后發生了什么。 如果有人可以告訴我這是代碼的症狀和我應該尋找什么問題,它會對我有很大的幫助。

如果myList是的數據成員MyClass ,具有push_back()要修改的myList的數據成員(因此要修改的實例MyClass指向通過this ),因此MyFunc()方法不能被標記為const

方法上的const意味着它不能修改它被調用的實例,包括任何實例成員。

您需要查看代碼庫並區分可以修改類實例(不應該是const )的方法和僅提供有關類實例(應該是const )的信息的方法。

$ 9.3.1 / 3:當一個id-expression(5.1)不屬於類成員訪問語法(5.2.5)並且不用於形成指向成員(5.3.1)的指針時,在類成員中使用在可以使用它的上下文中的X(5.1.1),如果名稱查找(3.4)將id-expression中的名稱解析為某個類C的非靜態非類型成員,並且如果是id-expression可能被評估或C是X或X的基類,id-expression被轉換為類成員訪問表達式(5.2.5)使用(* this)(9.3.2)作為左側的后綴表達式這個。 運營商。

這意味着表達方式

myList.push_back(i);

被視為

(*this).myList.push_back(i);

$ 9.3.1 / 4:非靜態成員函數可以聲明為const,volatile或const volatile。 這些cv限定符會影響this指針的類型(9.3.2)。

$ 9.3.2 / 1:在非靜態(9.3)成員函數的主體中,關鍵字this是一個prvalue表達式,其值是調用該函數的對象的地址。 類X的成員函數中的類型是X *。 如果成員函數聲明為const,則其類型為const X *,如果成員函數聲明為volatile,則其類型為volatile X *,如果成員函數聲明為const volatile,則此類型為const揮發性X *。

總之,這意味着你的成員函數中的'this'類型是'const'是'MyClass const *'。 實際上,這意味着不允許Myclass::MyFunc修改'this'指針所指向的對象的狀態。

假設myList的類型為std :: list,則std :: list :: push_back方法會修改實例變量'myList',因為它會在列表中插入'i'的值。

但這打破了'const'成員函數MyClass::MyFunc的語義,它承諾不會修改對象的狀態。

因此,您確實需要從此成員函數中刪除“const”或使用const_cast刪除此特定操作的常量。

暫無
暫無

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

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