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)
我不明白为什么有一个错误是一个案例而不是另外两个?
const TVPtr不是const void*,是的void* const.换句话说,它不是指针const void,它是const指针void.既然i被声明const它将很乐意绑定到a const void*,而不是a void* const,因为它会丢弃const对象本身的ness.
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在类型之后添加有助于可视化最终类型.
| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |