typedef with const且没有const限定符

Abh*_*ain 0 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;

}
Run Code Online (Sandbox Code Playgroud)

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

Tar*_*ama 7

const TVPtr不是const void*,是的void* const.换句话说,它不是指针const void,它是const指针void.既然i被声明const它将很乐意绑定到a const void*,而不是a void* const,因为它会丢弃const对象本身的ness.

  • `TVPtr`是一个指针,所以添加`const`使它成为一个`const`指针.它不会在类型中注入`const`ness. (4认同)

Naw*_*waz 6

const TVPtr
Run Code Online (Sandbox Code Playgroud)

手段:

void * const  //correct
Run Code Online (Sandbox Code Playgroud)

不是这个:

const void*   //wrong
Run Code Online (Sandbox Code Playgroud)

你似乎在想.


可视化有能力影响您的理解.

这就是为什么我认为const在这种类型之后推出更好的做法的一个原因.所以,如果你有这种做法:

void const * x;
Run Code Online (Sandbox Code Playgroud)

代替

const void * x; //same as void const *x!
Run Code Online (Sandbox Code Playgroud)

然后它有助于typedef和模板.

例如,采用此typedef:

typedef void* voidptr;
Run Code Online (Sandbox Code Playgroud)

现在,如果您编写以下内容并尝试可视化它是什么:

voidptr const x;
Run Code Online (Sandbox Code Playgroud)

然后你更有可能把它想象成:

void* const x; //correct
Run Code Online (Sandbox Code Playgroud)

事实上它是什么.

const之前的类型是反直觉:

const voidptr x;
Run Code Online (Sandbox Code Playgroud)

似乎是:

const void* x; //wrong
Run Code Online (Sandbox Code Playgroud)

这实际上是错的 - 它仍然是这样的:

 void* const x; //correct
Run Code Online (Sandbox Code Playgroud)

因此,const在类型之后添加有助于可视化最终类型.