2017-04-20 50 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; 
};