typedef with const且没有const限定符

时间:2015-08-26 10:59:07

标签: c++ c typedef

    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;

}

我不明白为什么有一个错误是一个案例而不是另外两个?

2 个答案:

答案 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);