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;
};
在我的代码上使用 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;
};