2017-04-20 96 views
-1

當我的代碼使用cppcheck它表示的功能可以作出常量。 Cppcheck似乎是正確的,但我發現代碼中的memcpy很奇怪。從代碼memcpy和const正確性

摘錄:

if ((offset + size) <= _bufferSize) 
     { 
      char* _destPtr = (char*)_buffer + offset; 
      memcpy(_destPtr, data, size); 
      result = true; 
     } 

據我瞭解的memcpy將間接寫入_buffer所以函數不是常量。但是,即使直接使用_buffer,編譯器仍然會編譯代碼而不會出錯。

爲什麼編譯器不會在這裏產生一個錯誤?

+3

很難說,如果你不發佈函數簽名並且cppcheck希望你放置'const'。請創建一個[MCVE]。 –

+6

它修改'_buffer'指向的東西,而不是'_buffer'本身;那麼它可能是'const'函數。 – songyuanyao

+2

您使用的是C風格的演員,這基本上意味着你比你的編譯器更好,它需要閉嘴,做你告訴它。如果您希望自己的工具爲您檢查代碼,請考慮不要使用C風格的演員表。 –

回答

1

在有些情況下const可以用指針來使用兩個不同的地方。

const char * x; // (1) data pointed by x is const 
char * const x; // (2) x itself is const 

使你的對象const使得它的指針型成員const的第二個含義,從來沒有在第一感。當前對象(*this)處於const成員函數const

如果您需要指向的數據變得過於const,你可以用你的三分球,做常量性的深傳播的自定義類:

template <class T> class deep_const_ptr { 
    // .... ctors, operator*, the usual stuff 
    T* get() { return data; } 
    const T* get() const { return data; } 
    private: 
    T* data; 
};