指向指针的 const 问题
const issue with pointer to pointer
我有一个函数可以用来删除缓冲区。指针是按地址传递的,因此一旦释放内存,函数也可以取消设置它们:
static void _FreeBuf( const uchar16_t ** pBufPtr );
void Ucs2String::_FreeBuf( const uchar16_t ** pBufPtr );
{
assert( NULL != pBufPtr && NULL != *pBufPtr );
delete[] *pBufPtr;
*pBufPtr = NULL;
}
但使用时如下:
_FreeBuf( & m_wsBuf );
其中 m_wsBuf
是成员:uchar16_t * m_wsBuf;
它产生一个错误:
Error 1 error C2664: 'core::Ucs2String::_FreeBuf' : cannot convert parameter 1 from 'uchar16_t **__w64 ' to 'const uchar16_t **'
删除 const 可以解决问题,但我不明白为什么。
该函数修改的是地址传递的指针,而不是指向的 const uchar16_t 数组,那么为什么我需要删除这个 const ?
PS : 我正在使用 VS2005(没有 C++11)
此处的问题是当您调用 _FreeBuf( & m_wsBuf );
函数时:您尝试将 X**
转换为 const X**
(此处 X 为 uchar16_t
,但错误无论类型是什么都会发生)。
当这种类型的转换隐式完成时(即没有 const_cast
),这在 C++ 中是被禁止的。
您可以通过删除 const
或将参数类型更改为 const uchar16_t * const*
来解决此问题(这在这种情况下不起作用,因为您无法将指针设置为 NULL功能)。
有关 C++ 以这种方式工作的原因的详细信息,请参阅 this link。
我有一个函数可以用来删除缓冲区。指针是按地址传递的,因此一旦释放内存,函数也可以取消设置它们:
static void _FreeBuf( const uchar16_t ** pBufPtr );
void Ucs2String::_FreeBuf( const uchar16_t ** pBufPtr );
{
assert( NULL != pBufPtr && NULL != *pBufPtr );
delete[] *pBufPtr;
*pBufPtr = NULL;
}
但使用时如下:
_FreeBuf( & m_wsBuf );
其中 m_wsBuf
是成员:uchar16_t * m_wsBuf;
它产生一个错误:
Error 1 error C2664: 'core::Ucs2String::_FreeBuf' : cannot convert parameter 1 from 'uchar16_t **__w64 ' to 'const uchar16_t **'
删除 const 可以解决问题,但我不明白为什么。 该函数修改的是地址传递的指针,而不是指向的 const uchar16_t 数组,那么为什么我需要删除这个 const ?
PS : 我正在使用 VS2005(没有 C++11)
此处的问题是当您调用 _FreeBuf( & m_wsBuf );
函数时:您尝试将 X**
转换为 const X**
(此处 X 为 uchar16_t
,但错误无论类型是什么都会发生)。
当这种类型的转换隐式完成时(即没有 const_cast
),这在 C++ 中是被禁止的。
您可以通过删除 const
或将参数类型更改为 const uchar16_t * const*
来解决此问题(这在这种情况下不起作用,因为您无法将指针设置为 NULL功能)。
有关 C++ 以这种方式工作的原因的详细信息,请参阅 this link。