Memcpy 和 const 正确性

Memcpy and const correctness

在我的代码上使用 cppcheck 时,它表明可以将函数设为常量。 cppcheck好像是正确的,但是我发现代码中的memcpy很奇怪。

代码摘录:

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

据我了解,memcpy 将间接写入 _buffer,因此该函数不是 const。但是,即使直接使用 _buffer,编译器仍然可以正确编译代码。

为什么这里编译器不报错?

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

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