Memcpy和const正确性

时间:2017-04-20 09:05:05

标签: c++ static-code-analysis cppcheck

在我的代码上使用cppcheck时,它指示一个函数可以成为const。 Cppcheck似乎是正确的,但我发现代码中的memcpy很奇怪。

摘自代码:

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

据我所知,memcpy将间接写入_buffer,因此该函数不是const。但是,即使直接使用_buffer,编译器仍会编译代码而不会出错。

为什么编译器不会在这里生成错误?

1 个答案:

答案 0 :(得分:2)

有两个不同的地方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,您可以将指针包装在一个执行constness深度传播的自定义类中:

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;
};