typedef void* TVPtr;
typedef const void* CTVPtr;
const TVPtr func3 (const TVPtr p)
{
return p;
}
const void* func4 (const void* p)
{
return p;
}
CTVPtr func5 (CTVPtr p)
{
return p;
}
int main ()
{
const uint64_t i = 10;
func3(&i); // compilation error here
// cannot convert argument 1 from 'const uint64_t *'
// to 'const TVPtr' Conversion loses qualifiers
func4(&i); // no compilation error
func5(&i); // no compilation error
return 0;
}
我不明白为什么有一个错误是一个案例而不是另外两个?
答案 0 :(得分:7)
const TVPtr
不是const void*
,而是void* const
。换句话说,它不是指向const void
的指针,而是指向const
的{{1}}指针。由于void
被声明为i
,因此它会愉快地绑定到const
,而不是const void*
,因为这会丢弃对象本身的void* const
。< / p>
答案 1 :(得分:0)
func3需要一个非const类型,并承诺不会通过参数列表中类型前面的const关键字来更改它。由于CTVPtr是一个指向const数据的指针,所以其他人可以使用指向const类型的指针。
我认为混淆来自你使用的const关键词实际上意味着func3不会改变p指向的数据,而不是说func3会接受const TVPtr。
如果你真的想将i的地址传递给func3,你可以像这样投出它
func3( (void*)&i);