在我的代码上使用cppcheck时,它指示一个函数可以成为const。 Cppcheck似乎是正确的,但我发现代码中的memcpy很奇怪。
摘自代码:
if ( (offset + size) <= _bufferSize )
{
char* _destPtr = (char*)_buffer + offset;
memcpy(_destPtr, data, size);
result = true;
}
据我所知,memcpy将间接写入_buffer,因此该函数不是const。但是,即使直接使用_buffer,编译器仍会编译代码而不会出错。
为什么编译器不会在这里生成错误?
答案 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;
};